Joshua Bloch Enum Singleton e API di terze parti

1

Nel libro Efficace Java dà la migliore implementazione del pattern Singleton nel suo, che è implementato da un Enum . Ho dei dubbi su come implementare questo modello con un'API di terze parti.

Sto usando un'API di terze parti che fornisce un'interfaccia IRCApi che ha molti metodi come:

public interface IRCApi{
    void connect();
    void disconnect();          
    void disconnect(String aQuitMessage);
    void joinChannel(String aChannelName); 
    //...
}

La mia domanda: il frammento di codice è sotto un'implementazione valida di quel modello di design con tutti i vantaggi citati da Joshua Bloch (supporto multi-thread, possibilità di cambiare, ecc.):

public enum IRCApiSingleton {
    INSTANCE;

    private final IRCApi ircApi = new IRCApiImpl(false);

    public final IRCApi get() {
        return ircApi;
    }
}

utilizzando in questo modo:     IRCApiSingleton.get () connect ();.

O devo rendere il mio enum implementare IRCApi e incapsulare tutti i metodi di un'implementazione IRCApi (ci sono circa 40 metodi), come:

public enum IRCApiSingleton implements IRCApi {
    INSTANCE {
        private IRCApi impl = new IRCApiImpl(true);    
        @Override
        public void connect() {
            impl.connect();

        }

        @Override
        public void disconnect() {
            impl.disconnect();
        }
        //...
    };
}

e usa direttamente l'ISTANZA?

    
posta alexpfx 03.07.2015 - 04:52
fonte

2 risposte

1

Bene, come vedo io, IRCApiImpl ha un costruttore pubblico che rende difficile chiamare in entrambi i casi un "singleton classico".

Tuttavia, direi che se segui la linea guida di non creare un'altra istanza di IRCApiImpl in nessun altro punto o anche meglio, rendendo la classe inaccessibile, puoi usare entrambe le implementazioni.

Da un punto di vista rigoroso dell'ingegneria del software, sarebbe preferibile la prima implementazione, poiché consentirebbe un minore accoppiamento e non avrebbe bisogno di essere modificato quando l'API di IRCApiImpl cambiava.

Personalmente preferirei la seconda implementazione, che ti salva .get () in ogni chiamata.

    
risposta data 03.07.2015 - 08:35
fonte
2

Vorrei fare un passo indietro e chiederti perché stai cercando di creare un singleton in primo luogo. Non fraintendermi, so che c'è molta gente che odia singleton, e penso che un sacco di quell'odio sia ingiustificato. Detto questo, non sembra che il tuo singleton fornisca alcuna funzionalità tranne che agisce come costante globale a IRCApiImpl .

Se avessi dichiarato IRCApiImpl come enum (o equivalentemente, preso tutto il codice in IRCApiImpl e collocato all'interno di IRCApiSingleton ), allora penserei che applicheresti correttamente lo schema di Joshua Bloch.

Ma dato che non solo non l'hai fatto, ma IRCApiImpl sembra avere un costruttore che prende un parametro (implicando che potrebbero esserci più istanze di esso, ognuno prendendo un diverso insieme di parametri quando sono stati costruiti ), sembra che quello con cui stai lavorando non sia affatto concettualmente concettuale.

Se stai cercando di usare Singleton perché vuoi un facile accesso a un oggetto, ti consiglio di guardare invece l'iniezione delle dipendenze.

    
risposta data 03.07.2015 - 09:27
fonte