quiero crear un genérico de clase singleton en java bruja da singleton un objeto de la clase que me pase en el parámetro de método. algunas cosas como el código de abajo : por favor, ayudar

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 ...;
    }
}
¿Por qué usted necesita para ser genérico? En su ejemplo, usted no está utilizando T de ninguna manera.
podría ser útil. stackoverflow.com/questions/7286762/…
Esto no resultado de la nbe una violación de la idea de que el singleton se basa en (sólo tener una instancia de esa clase)?
¿Qué es exactamente lo que quieres lograr? Si es un verdadero singleton, no puede ser muy genérico, porque usted tiene que elegir el tipo de parámetro en la creación. O quieres una instancia por cada tipo T?
Por cierto, un generified singleton definitivamente puede hacer sentido, siempre y cuando no se te ocurra tomar o dar a instancias de su parámetro genérico. Collections.empty[List|Map|Set]() volver singleton de los casos que se producirá un error si se intenta agregar o conseguir alguno de los elementos. El emptyList (etc) de los métodos tienen un desactivada cast para convertir el singleton en un List<T> (lo mismo para las otras interfaces de colección).

OriginalEl autor saurabhking | 2012-08-02

5 Comentarios

  1. 6

    Hacer un enum con un solo valor, INSTANCE o tal. Instantánea singleton.

    Si lo entiendo correctamente, creo que quiere que su singleton para implementar algunas interfaz genérica? Algo así como:

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

    En ese caso, puede utilizar un desmarcado de fundición para la devolución de su enum-como-singleton en un generified manera. Esto es seguro, siempre y cuando su singleton en realidad no utilizar la instancia (o por el contrario, sólo asumir que es un Objeto).

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

    Si la interfaz es un productor en lugar de los consumidores, es decir, devuelve un T –, a continuación, sólo puede regresar null de forma segura. De lo contrario, alguien más va a obtener una ClassCastException cuando intenta utilizar su T, que ellos piensan que es un Foo, pero en realidad es sólo un Objeto.

    +1 , yo también, no se por qué la downvote , es trivial y simple, buena solución, aquí también es un buen enlace para una discusión acerca de una Enumeración de ser un singleton de implementación closingbraces.net/2011/07/04/enum-as-singleton

    OriginalEl autor yshavit

  2. 3

    Este iba a ser el comentario pero creo que es mejor que sea una respuesta debido a la limitación de caracteres,

    Pensamiento poco más profundo será realmente posible crear un genérico de clase singleton?

    Una clase singleton no puede ser instanciado tampoco debe ser clonado.

    A dar ninguna clase de este comportamiento, se tendrá que hacer all the constructors private and clone method will have to be overridden to throw an exception. Ahora si se van a cambiar todas sus clases para implementar este comportamiento es su forma de crear singleton realmente genérico?

    Por favor me disculpe si he interpretado la pregunta erróneamente

    OriginalEl autor Sap

  3. 1

    No estoy seguro si entiendo tu pregunta totalmente, pero si desea integrar un singleton en un genérico jerarquía, usted tiene que hacer un poco de trampa (como hicimos en el este tema):

    interface Listener<T>{
        //...
    }
    
    @SuppressWarnings("unchecked")
    final class SingletonListener {
    
        private SingletonListener(){ 
            assert false : "Uninstantiable"; 
        }
    
        public Listener<T> instance(){
            return SingletonListenerInstance.INSTANCE;
        }
    
        //Note - implements Listener without specifying type parameters!
        private enum SingletonListenerInstance implements Listener { 
            INSTANCE;
            //Insert listener methods here
        }
    
    }
    
    //Usage:
    Listener<Pony> ponyListener = SingletonListener.instance();
    No debería ser final class SingletonListener<T> { ?

    OriginalEl autor gustafc

  4. 1

    Puede hacer algo como esto, pero no es confiable, en mi humilde opinión:

    public class SimpleSingleton {
    private Map<String, Object> counter = new HashMap<String, Object>();
    
    public <T> T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException {
        T singleton = (T) counter.get(clazz.getName());
        if (singleton == null) {
            singleton = clazz.newInstance();
            counter.put(clazz.getName(), singleton);
        }
        return singleton;
    }

    }

    OriginalEl autor m3th0dman

  5. 1

    La solución a este problema fue el diseño como este:

    public interface IListener<T extends Object>  {
        void handle(T event);
    }
    
    public final class Listener implements IListener<Object> {
        private static Listener instance = new Listener();
    
        private Listener() {
        }
    
        public static Listener getInstance() {
            return instance;
        }
    
        @Override
        public void handle(Object event) {
            //TODO Do stuff
        }
    }

    OriginalEl autor Laurentiu Stamate

Dejar respuesta

Please enter your comment!
Please enter your name here