繁体   English   中英

有没有一种方法可以为具有标识方法的泛型类创建通用单例?

[英]Is there a way to create a universal singleton for a generic class which has an identity method?

我有一个简单的界面:

public interface Constraint<T> {
    T constrain(T unconstrainedValue);
}

并且我想创建一个可以用于任何类型的UNCONSTRAINED单例...是否有一种方法可以为每个类型创建单独的对象?

static class NoConstraint<T> implements Constraint<T> {
    @Override public T constrain(T unconstrainedValue) { return unconstrainedValue; }
}

您可以使用不安全的强制转换来做到这一点,您知道这是安全的:

static class NoConstraint<T> implements Constraint<T> {
    private static final Constraint rawInstance = new NoConstraint();

    public static <T> Constraint<T> instance() {
        @SupressWarnings("unchecked")
        Constraint<T> generic = rawInstance;
        return generic;
    }

    @Override
    public T constrain(T unconstrainedValue) {
        return unconstrainedValue;
    }
}

不用说,只有在向自己证明它总是安全的情况下才应该这样做(在这种情况下,这很容易做到)。

在这种情况下,这并不是一个不常见的技巧。 例如, Collections.emptyList (以及该类中的类似方法)使用此技术。

还要注意的是Tinstance()方法是从不同 TConstraint<T>尽管它们共享相同的名称的事实。 约束T仅在实例上下文中可用,而在静态上下文中不可用,因此我们必须为静态方法声明一个通用参数。 在大多数情况下,用这样的名称遮盖是很危险的。 在这种情况下,我发现它很有用,作为视觉上的提醒,就一般用户而言,两个T紧密相连。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM