如何在泛型中实现空对象模式?

jan*_*jan 5 java generics null design-patterns

我喜欢空对象模式的想法,并强迫我使用它,直到它真正感觉正常和良好为止。目前我不知道如何在泛型类型中使用它。我知道可以定义第二个泛型类型并传入类来构造默认对象,但这对于这种模式来说确实开销太大。有什么好的办法吗?

public class GenericExample<T> {
    public static final GenericExample NULL = ???;

    private T attribute;

    public GenericExample(T attribute) {
        this.attribute = attribute;
    }
}

public class HoldGeneric {
    private GenericExample<String> name = GenericExample.NULL;

    public initLater(String name) {
        this.name = new GenericExample<String>(name);
    }
}
Run Code Online (Sandbox Code Playgroud)

dka*_*zel 4

您可以遵循 JDK 的做法,使用静态方法来推断泛型类型并执行未经检查的强制转换。

java.util.Collections为空列表和集合实现 Null 对象。在Java预泛型中,有一个公共静态字段。

public static final List EMPTY_LIST = new EmptyList();
Run Code Online (Sandbox Code Playgroud)

后泛型:现在有静态方法可以推断泛型类型并执行未经检查的转换,以便您将其转换为正确的类型。类型并不重要,因为集合是空的,但它让编译器满意。

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
Run Code Online (Sandbox Code Playgroud)