HLR*_*HLR 4 java oop javafx static-factory
在 JavaFX 中,有一些类(例如 javafx.scene.text.Font 和 javafx.scene.paint.Color)具有类似于构造函数的静态方法。在 Font 类中,可以使用语句创建一个新的 Font 对象new Font(name, size),但它相当于调用静态方法Font.font(name, size),其中 Font.font 方法返回对新 Font 对象的引用。JavaFX 通过创建这些 \xe2\x80\x98static\xe2\x80\x99 构造函数获得了哪些客观好处?它们看起来是多余的。为什么不直接声明更多的重载构造函数来实现相同的目标呢?
一般来说,与使用构造函数相比,使用静态工厂方法有几个优点和缺点。Joshua Bloch 的《Effective Java》(我强烈建议所有 Java 程序员都应该阅读)是一个很好的参考资料;在第二版和第三版中它是第1项。
对于您提到的具体课程:
Color由于工厂方法有名称,因此使用工厂方法允许多个方法具有相同的签名。例如
public static Color color(double red, double green, double blue);
public static Color hsb(double hue, double saturation, double brightness);
Run Code Online (Sandbox Code Playgroud)
它们不能被两个不同的构造函数替换,因为它们会产生歧义。
此外,可以说工厂方法提供了更具描述性的名称。例如,这两种方法
public static Color valueOf(String value);
public static Color web(String colorString);
Run Code Online (Sandbox Code Playgroud)
具有完全相同的功能,但从设计角度来看两者都很有价值。该valueOf()方法允许与 进行交互FXMLLoader,而该web(...)方法的命名更为恰当(它采用与 HTML 规范中使用的格式相同的字符串)。
Font此类的基本原理不太清楚,要了解确切的原因需要了解原始 API 设计者的想法。但请注意,静态工厂方法的API 规范与构造函数不同:
public static Font font(String family, double size)
Run Code Online (Sandbox Code Playgroud)
根据字体系列名称和大小搜索合适的字体。此方法不保证返回特定字体,但会尽力找到符合指定要求的字体。family 的 null 或空值允许实现选择任何合适的字体。
public Font(String name, double size)
Run Code Online (Sandbox Code Playgroud)
使用指定的完整字体名称和大小构造字体
据我所知,当前的实现实际上是相同的,但 API 规范允许在未来的版本中进行更改。还可能有其他好处,例如静态工厂方法可以缓存字体并返回相同的实例(如果确定这是性能增强)。