我有下一个问题。我有一个界面:
public interface Worker<T> {
public void start(Class<? extends T> taskClass);
}
以及该接口的单例实现:
public final class Listener<T extends Runnable> implements Worker<T> {
private Listener() {}
@Override
public void start(Class<? extends T> taskClass) { ... }
public static Listener getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
public static final Listener INSTANCE = new Listener();
}
}
我的问题是,我可以通过这种方式获取单例实例:
Worker<Thread> listener = Listener.getInstance();
仍然是类型安全的吗?如果不是,我如何在单例实例中使用泛型来实现类型安全?
所有泛型都会在运行时被剥离。
这意味着您只会拥有一个static class SingletonHolder
并且只有一个INSTANCE
不管通用是什么。
为了克服这个问题,如果有意义的话,您可以拥有“多个单例”。您必须添加某种注册,因此,如果您尝试获取尚不存在的注册,请在返回之前创建并存储它。请注意,这尚未编译,并且可能存在一些问题,但基本方法仍然相同。
public final class Listener<T extends Runnable> implements Worker<T> {
private Listener() {}
@Override
public void start(Class<? extends T> taskClass) { ... }
public static Listener getInstance(Class<T> clazz) {
return SingletonHolder.INSTANCE.get(clazz);
}
private static class SingletonHolder {
private static final Map<Class<? extends Runnable>,Listener<? extends Runnable> INSTANCE = new ...;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)