如何在java中创建通用单例类?

sau*_*ing 6 java generics

我想在java中创建一个通用的单例类,给出了我在类参数中传递的类的单例对象.有点像下面的代码:请帮助

public final class Listener<T extends Object>  {
    private Listener() {
    }

    public static <T> Listener<?> getInstance(Class<T> clazz) {
        return SingletonHolder.INSTANCE;
    }

    private static class SingletonHolder {
        public static final Listener INSTANCE = new Listener();
        // private static final Map<Class<? extends Runnable>,Listener<? extends
        // Runnable> INSTANCE = new ...;
    }
}
Run Code Online (Sandbox Code Playgroud)

ysh*_*vit 6

做一个enum只有一个值,INSTANCE或者这样的.即时单身人士.

如果我理解正确,我想你希望你的单例实现一些通用接口?就像是:

interface ListenerInterface<T> {
    void handleEvent(T event);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以使用未经检查的强制转换以常规方式返回您的枚举单例.只要你的单例实际上没有使用实例(或者只假设它是一个Object),这是安全的.

public enum MySingleton implements ListenerInterface<Object> {
    INSTANCE;

    @SuppressWarnings("unchecked")
    public static <T> ListenerInterface<T> getListener() {
        return (ListenerInterface<T>) INSTANCE;
    }

    public void handleEvent(Object event) {
        System.out.println("I am a singleton. An event happened: " + event);
    }

}
Run Code Online (Sandbox Code Playgroud)

如果接口是生产者而不是消费者 - 也就是说,它返回一个T- 那么你只能null安全地返回.否则,其他人在尝试使用他们时会得到ClassCastException T,他们认为这是一个Foo但实际上只是一个Object.