为什么在java中没有可选的公共构造函数?

2022-09-01 11:20:32

为什么有像 和 这样的方法,而不是公共构造函数?Optionalof()ofNullable()


答案 1

摘自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;
}

答案 2

原因其实很简单:空的可选是一个静态常量,以提高内存效率。如果使用构造函数,则每次都必须为常见情况创建一个新实例。

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);
}