繁体   English   中英

Java中的静态构造函数方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM