2016-12-15 63 views
1

我学习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); 

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

第一选项的优点是什么?

有人能传播光吗?

+2

你必须有一切的工厂方法。 [企业质量代码,在这里。](https://github.com/EnterpriseQualityCoding/FizzBu​​zzEnterpriseEdition) –

+0

其他重复:http://stackoverflow.com/questions/194496/static-factory-methods-vs-instance-normal-构造函数http://softwareengineering.stackexchange.com/questions/240351/using-a-simple-static-factory-vs-instantiating-directly-new-thing-vs-factor – assylias

回答

2

由于Sotirios Delimanolis在评论中写道,第一个是静态工厂模式。使用这种模式你的类不能被扩展,因为没有访问构造函数。另外,静态工厂模式可以用于其他方式,例如,控制创建的实例的数量,或者返回不同类的实例(通常应用相同的接口)。

一个私人用例是着名的Singleton模式。 另一个是对象池。

+0

所以,据我了解你的最佳做法是使用工厂模式,因为它给了我额外的选择,对吧? – snaggs

+0

@snaggs是的,它鼓励针对接口而不是特定类进行编码(更好的抽象),这会使您在实现和修改时有更好的灵活性,您可能希望在此方法中应用这些灵活性。在[有效的java](http://www.informit.com/articles/article.aspx?p=1216151)中鼓励使用静态工厂 - 这是一本强烈建议任何Java程序员使用的书!如果需要接口,则为 – alfasin

+0

是。否则不。创建一个仅用于创建界面的界面就是噪音。看看这个:http://stackoverflow.com/questions/956011/useless-interfaces – davidxxx

相关问题