为什么在java中没有可选的公共构造函数?
2022-09-01 11:20:32
为什么有像 和 这样的方法,而不是公共构造函数?Optional
of()
ofNullable()
为什么有像 和 这样的方法,而不是公共构造函数?Optional
of()
ofNullable()
摘自Joshua Bloch Effective Java,第2章。创建和销毁对象,1 个项目:
考虑静态工厂方法而不是构造函数
为什么?
静态工厂方法的一个优点是,与构造函数不同,它们具有名称。
使用静态工厂方法,我们可以在方法定义中指定一些实例化行为。这使得API更易于使用,我们可以防止客户端调用错误的构造函数。
例如:在 Optional.ofNullable
->中,我们允许传递 null 值以实例化 Optional,在 Optional.of
中,不允许空值并引发异常。我们不能在这里使用构造函数。
private Optional(T value) {
this.value = Objects.requireNonNull(value); //this throws NullPointerException
}
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
另一个优点(已经提到):
静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时都创建新对象。
在 Optional 中,空值仅实例化一次,然后存储在静态字段中,当程序需要空值时,始终重用此值。
private static final Optional<?> EMPTY = new Optional<>(); //instantiate value when program starts
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY; //return stored value when requested
return t;
}
原因其实很简单:空的可选是一个静态常量,以提高内存效率。如果使用构造函数,则每次都必须为常见情况创建一个新实例。
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}