[英]Static constructor methods in Java
我不太确定该怎么称呼它,因为“静态构造函数”似乎传达了静态初始化程序块的概念,但我的问题与样式有关。
假设我有一个类武器 ,它有你的标准构造函数来初始化武器的统计数据。 这很好,但有时候我想随机生成武器。 我可以创建一个名为FromRandom的静态方法,它创建一个带有随机统计数据的新武器并返回它。 这样我可以做这样的事情:
Weapon randWeapon = Weapon.FromRandom();
对此有何共识? 这是可接受的代码吗?
给一个类静态方法,通过返回它们所在类的实例来提供更多控制和优雅,这是完全可以接受的代码。 这实际上称为工厂方法模式,并且在创建类的实例时更好地控制时经常使用。
基本上,你有静态方法调用其中一个类构造函数,在记录对象的创建,将其添加到集合,对其执行进一步操作等方面做任何需要做的事情,然后返回创建的对象,因此该方法最终像普通构造函数一样使用。 :d
我希望有多个构造函数,参数确定如何创建对象。 如果只有两个选项,请使用布尔值(您可以保留默认版本并将其链接)。 如果有很多,请使用enum参数。
但是,我不一定认为你的代码错了。 番石榴使用类似的风格(见Lists
)。 但是,请注意它返回另一个类( List
)的实例,并且它本身没有构造函数。
这是一种众所周知的设计模式(在某种程度上),称为抽象工厂模式,请参阅: http : //en.wikipedia.org/wiki/Abstract_factory_pattern
一般来说,这很好,并为您提供一些代码优雅。 但我建议这只适用于工厂类。 为什么? 让我们考虑你的例子
Weapon weapon = Weapon.create();
如果我有一个Weapon
的子类,例如Pistol
的静态方法类似于前面你可以传递一个参数(例如子弹大小),那么你可能会做
Weapon randWeapon = Pistol.create("9mm");
但你可能会错误地做
Weapon randWeapon = Pistol.create();
它不会创建Pistol
,而是父类的实例。 这是期望的吗? 不确定。 会更糟吗? 好吧,想想在Pistol
类中定义create
方法的可能性
public static Pistol create(String ... args){...}
吓跑,不是吗?
所以,如果一个人不想创建一个工厂类,解决方案就是让这个类成为final
,但我通常建议人们不要创建最终的类(考虑模拟的问题)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.