2015-04-13 21 views
7

Ho una domanda di design nella mia mente. Supponiamo che se ho una classe che ha solo metodi statici, quale sarebbe la migliore opzione di progettazione tra i due seguenti.fare un abstract di classe vs rendere il costruttore privato

  • rendere la classe astratta
  • Fai il costruttore privato, in modo che nessun codice esterno alla classe può fare un oggetto di questa classe.

La scelta dipende dalla situazione o c'è un modo migliore per andare? E perché?

+0

Avete bisogno di un modello singleton? –

+0

Generalmente le classi di utilità (che sembra essere questa) vanno con un costruttore privato. –

+0

@SergeyPauk Solo un'ipotesi plausibile ma "* classe che ha solo metodi statici *" – jdphenix

risposta

9

La creazione di una classe astratta presuppone che l'utente sia il desidera che questa classe sia ereditata da. Se vuoi che ciò accada, rendilo astratto.

Se si dispone solo di metodi statici (quindi è una sorta di classe di utilità), passare al secondo modo.
Sebbene non vi sia nulla di sbagliato nella creazione di un'Istanza di questa classe, poiché non vi è alcun vantaggio o svantaggio in questo modo, la procedura migliore è rendere privato il costruttore per le classi di utilità.

1

Costruttore privato di sicuro. In generale, una classe con solo metodi statici dovrebbe essere:

public final class Utility { 
    public static void foo() { } 
    // ... etc. 
} 

Se si dichiarò astratto, è ragionevole presumere che si voleva che fosse ereditato, che non è il caso dalla tua descrizione.

La dichiarazione finale garantisce che non può essere esteso. sguardo

+0

rende davvero necessaria la finalizzazione? cosa succede se voglio estenderlo in futuro? – DesirePRG

+0

Quindi non lo dichiareresti definitivo. Ammetterò prontamente di non aver mai incontrato uno scenario in cui avrei voluto estendere una classe di utilità. – jdphenix

+0

Un commento afferma che rendere privato il costruttore, mi impedisce di estendere la classe. quindi renderlo definitivo mi dà qualche valore aggiuntivo? – DesirePRG

3

Let a ciò che gli sviluppatori di classi standard fatto:

public class Arrays { 
    // Suppresses default constructor, ensuring non-instantiability. 
    private Arrays() { 
    } 

public class Collections { 
    // Suppresses default constructor, ensuring non-instantiability. 
    private Collections() { 
    } 

vedo un modello qui.

Questo ha senso, poiché una classe astratta implica che la classe debba essere sottoclassata, il che non è il caso quando la classe è una classe di utilità che ha solo metodi statici.

1

Direi "entrambi".

Rendere astratto la classe impedisce all'utente potenziale di creare la sua istanza anche utilizzando la riflessione. Garantisce che l'utente presta attenzione che si tratta di pura classe di utilità e non dovrebbe essere istanziato.

Il costruttore di classe astratta non dovrebbe mai essere pubblico. Se la classe è dedicata per l'estensione, il costruttore dovrebbe essere protetto perché comunque può essere utilizzato solo da sottoclassi. Ma la tua classe non può essere ereditata. Pertanto il suo costruttore può essere solo privato. Inoltre, per essere al sicuro, il costruttore può lanciare IllegalStateException. In questo caso, anche se qualcuno in futuro lo rende pubblico, non può chiamarlo senza modificarne il codice.

+0

quello che stai dicendo è che ho bisogno di una classe astratta con un costruttore privato? – DesirePRG

+0

@DesirePRG, IMHO sì. Dai un'occhiata anche ad altre risposte. Altre persone pensano che dovresti definire la classe 'abstract' solo se * vuoi * estenderla. – AlexR

3

Penso che l'approccio migliore sia creare una classe finale con un costruttore privato. Perché lo scopo di una classe astratta è di funzionare come base per sottoclassi.

+0

ma se lo faccio in modo definitivo, non sarò in grado di estendere la classe in futuro, se mai lo volessi. quindi è un buon modo per andare? – DesirePRG

+1

se si rende privato il costruttore per impostazione predefinita rendere la vostra classe non estensibile. Hai anche detto che la classe conterrà solo metodi statici. quindi l'estensione della classe significa anche meno :) –

+0

great. ciò ha senso! – DesirePRG

Problemi correlati