如何在java中创建一个通用的单例类? [英] how to create a generic singleton class in java?

查看:494
本文介绍了如何在java中创建一个通用的单例类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在java巫婆中创建一个通用的单例类,给出我通过方法参数传入的类的单例对象。如下面的代码:请帮助

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

public static< T>听者LT;?> getInstance(Class< T> clazz){
返回SingletonHolder.INSTANCE;


private static class SingletonHolder {
public static final Listener INSTANCE = new Listener();
//私有静态最终地图< Class<扩展可运行>,监听器<?扩展
// Runnable> INSTANCE = new ...;


$ / code>


解决方案

Make一个枚举只有一个值, INSTANCE 等。即时单身。



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

  interface ListenerInterface< T> {
void handleEvent(T event);





$ b在这种情况下,你可以使用未经检查的转换来返回你的enum-as - 以一种通用的方式。这是安全的,只要你的单例没有实际使用实例(或者,只假设它是一个Object)。

  public enum MySingleton实现了ListenerInterface< Object> {
INSTANCE;

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

public void handleEvent(Object event){
System.out.println(我是一个单身人士,一个事件发生了:+ event);
}

}

如果界面是生产者的消费者 - 也就是说,它返回一个 T - 那么您只能安全地返回 null 。否则,当其他人尝试使用他们的 T 时,他们会认为是Foo,但实际上只是一个Object。


i want to create a generic singleton class in java witch gives singleton object of class which i pass in method parameter. some thing like below code : please help

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

解决方案

Make an enum with just one value, INSTANCE or such. Instant singleton.

If I understand you correctly, I think you want your singleton to implement some generic interface? Something like:

interface ListenerInterface<T> {
    void handleEvent(T event);
}

In that case, you can use an unchecked cast to return your enum-as-singleton in a generified way. This is safe as long as your singleton doesn't actually use the instance (or else, only assume it's an 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);
    }

}

If the interface is a producer instead of consumer -- that is, it returns a T -- then you can only return null safely. Otherwise, someone else will get a ClassCastException when they try to use their T, which they think is a Foo but is actually just an Object.

这篇关于如何在java中创建一个通用的单例类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆