Java中的静态构造函数方法

时间:2012-02-07 00:26:47

标签: java

我不确定该怎么称呼它,因为“静态构造函数”似乎传达了静态初始化程序块的概念,但我的问题与样式有关。

假设我有一个 Weapon 类,它有你的标准构造函数来初始化武器的统计数据。这很好,但有时候我想随机生成武器。我可以创建一个名为 FromRandom 的静态方法,它创建一个带有随机统计数据的新 Weapon 并返回它。这样我可以做这样的事情:

Weapon randWeapon = Weapon.FromRandom();

对此有何共识?这是可接受的代码吗?

4 个答案:

答案 0 :(得分:5)

通过返回它们所在的类的实例,给一个类静态方法提供更多的控制和优雅是完全可以接受的代码。这实际上称为the factory method pattern,当您在创建类的实例时更好地控制时,它经常被使用。

基本上,你有静态方法调用其中一个类构造函数,在记录对象的创建,将其添加到集合,对其执行进一步操作等方面做任何需要做的事情,然后返回创建的对象,因此该方法最终像普通构造函数一样使用。 :d

答案 1 :(得分:2)

我更喜欢有多个构造函数,参数决定了如何创建对象。如果只有两个选项,请使用布尔值(您可以保留默认版本并将其链接)。如果有很多,请使用枚举参数。

但是,我不一定认为你的代码错了。 Guava使用类似的风格(见Lists)。但是,请注意它返回另一个类(List)的实例,并且它本身没有构造函数。

答案 2 :(得分:1)

这(在某种程度上)与众所周知的设计模式(称为抽象工厂模式)相关,请参阅:http://en.wikipedia.org/wiki/Abstract_factory_pattern

答案 3 :(得分:0)

一般来说,这很好,并为您提供一些代码优雅。但我建议这只适用于工厂类。 为什么?让我们考虑你的例子

Weapon weapon = Weapon.create();

如果我有Weapon的子类,例如Pistol使用类似于之前的静态方法,你可以传递一个参数(例如子弹大小),然后你可以做

Weapon randWeapon = Pistol.create("9mm");

但你可能错误地做了

Weapon randWeapon = Pistol.create();

不会创建Pistol,而是创建父类的实例。这是期望的吗?不确定。会更糟吗?好吧,只考虑将类create中的Pistol方法定义为

的可能性
public static Pistol create(String ... args){...}

吓跑,不是吗?

所以,如果一个人不想创建工厂类,解决方案就是创建类final,但我通常建议人们不要创建最终类(考虑模拟问题)。