【问题标题】:Two ways of class initialization what is the difference? [duplicate]类初始化的两种方式有什么区别? [复制]
【发布时间】:2017-05-01 10:27:12
【问题描述】:

我学习Java,想知道下面的类初始化实现有什么区别。

[选项 1]

public class LaunchHandler implements SomeItf{

   public static LaunchHandler create(ArrayList<String> params){
        LaunchHandler self = new LaunchHandler(params);
        return self;
    }

   private LaunchHandler(ArrayList<String> params){
        mParams = params;
    }
}

所以我称之为:

SomeItf  launch = LaunchHandler.create(params);

[选项 2]

public class LaunchHandler implements SomeItf{ 

   public LaunchHandler(ArrayList<String> params){
        mParams = params;
    }
}

我称之为:

SomeItf  launch = new LaunchHandler(params);

对我来说,这两个选项都做同样的事情,但我在大项目中看到了第一个选项。

第一个选项的优势是什么?

有人可以传播光吗?

【问题讨论】:

标签: java


【解决方案1】:

正如 Sotirios Delimanolis 在 cmets 中所写,第一个是静态工厂模式。使用这种模式,您的类无法扩展,因为无法访问构造函数。

此外,静态工厂模式还可以用于其他方面,例如,控制创建的实例数量,或返回不同类的实例(通常应用相同的接口)。

一个私有用例是著名的单例模式。 另一种是对象池。

【讨论】:

  • 所以据我了解,最佳实践是使用工厂模式,因为它为我提供了更多选择,对吧?
  • @snaggs 是的,它鼓励针对接口而不是特定类进行编码(更好的抽象),这为您提供了更好的实现灵活性以及您可能希望在此过程中应用的修改。 effective java 鼓励使用静态工厂——这本书强烈推荐给任何 Java 程序员!
  • 如果需要接口是的。否则没有。仅仅为了创建界面而创建界面是噪音。看看这个:stackoverflow.com/questions/956011/useless-interfaces
  • @davidxxx 这是一个见仁见智的问题。确保阅读已接受答案的最后一句话(括号中) - 在您发布的链接中。
  • 确实,我给出了我的意见 :) 我读了。其实它是怎么写的也不是很清楚。我更强调作者提到的 XP 实践: YAGNI(你不需要它):不要添加不需要的东西。接口的定义可能有多种原因。如果你没有任何具体的理由使用它,但你使用它,你添加的东西不是必需的。这属于 YAGNI。
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
相关资源
最近更新 更多