Ioa*_*oan 20
Joshua Bloch建议采用静态工厂方法而不是构造函数(我认为这是一种很好的做法).优点和缺点:
静态工厂方法的优点:
Boolean.valueOf(..)
静态工厂方法的缺点:
Pet*_*rey 19
当您只想返回一个类型的新对象并且想要简单时,请使用公共构造函数.
一个很好的例子是StringBuilder,因为它是可变的,你可能每次都想要一个新对象.
public String toString() {
StringBuilder sb = new StringBuilder();
// append fields to the sb
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
当您可能想要重用对象时使用静态因子方法(特别是如果不可变),您可能想要返回子类或者您想要describeice构造.一个很好的例子是EnumSet,它有许多静态工厂,即使有些工具具有相同的参数,它们也会做不同的事情.
EnumSet.noneOf(RetentionPolicy.class);
// has the same arguments, but is not the same as
EnumSet.allOf(RetentionPolicy.class);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,使用静态工厂可以清楚地了解这两种构造方式之间的区别.
此外,EnumSet可以返回两个不同的实现,一个针对具有少量值(<= 64)的枚举进行优化RegularEnumSet
,另一个针对多个值进行调优JumboEnumSet
如果您的类具有状态(即使是单个实例;单例模式),也始终使用构造函数.
仅对java.lang.Math中的实用程序方法使用static
例:
public static int max(int a, int b) {
return (a >= b) ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
不更改对象的任何状态(实例变量),因此可以将其声明为static.