Domanda

Ho una classe piena di funzioni di utilità. Istanziare un'istanza non ha senso semantico, ma ho ancora voglia di chiamare i suoi metodi. Qual è il modo migliore per affrontare questo? classe statica? Estratto?

È stato utile?

Soluzione

costruttore privato e metodi statici in una classe segnato come finale.

Altri suggerimenti

Secondo il grande libro "Effective Java" :

Punto 4: Applicare noninstantiability con un costruttore privato

-. Il tentativo di far rispettare noninstantiability facendo una classe astratta non funziona

- Un costruttore di default viene generato solo se una classe non contiene esplicite costruttori, in modo da una classe può essere fatta noninstantiable includendo un costruttore privato:

// Noninstantiable utility class
public class UtilityClass
{
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

Perché il costruttore esplicito è privato, è al di fuori inaccessibile della classe. L'AssertionError non è strettamente necessario, ma fornisce l'assicurazione nel caso in cui il costruttore è accidentalmente invocato dall'interno della classe. Garantisce che la classe non verrà mai istanziato in nessun caso. Questo linguaggio è leggermente controintuitivo, come il costruttore è espressamente disposto in modo che non può essere invocata. È quindi opportuno includere un commento, come indicato sopra.

Come effetto collaterale, questo linguaggio impedisce anche la classe di essere sottoclasse. Tutti i costruttori devono invocare un costruttore della superclasse, esplicitamente o implicitamente, e una sottoclasse non avrebbe alcun costruttore della superclasse accessibili per richiamare.

Suona come si dispone di una classe di utilità simile a java .lang.Math .
L'approccio non è di classe finale con il costruttore privato e metodi statici.

Ma attenzione di ciò che questa fa per testabilità, vi consiglio di leggere questo articolo
metodi statici sono morte a Testabilità

Solo per nuotare controcorrente, i membri statici e le classi non partecipano in OO e sono quindi il male. No, non il male, ma sul serio, mi sento di raccomandare una classe regolare con un pattern Singleton per l'accesso. In questo modo se avete bisogno di ignorare il comportamento in ogni caso lungo la strada, non è una grande riconversione. OO è tuo amico: -)

Il mio $ .02

commento sugli argomenti "costruttore privato": dai, gli sviluppatori non sono così stupidi; ma sono pigri. creazione di un oggetto quindi chiamare metodi statici? Non succederà.

non spendere troppo tempo per assicurarsi che la classe non può essere oggetto di abuso. avere un po 'di fede per i vostri colleghi. e c'è sempre un modo per abusare vostra classe non importa come si proteggono. l'unica cosa che non può essere oggetto di abuso è una cosa che è del tutto inutile.

  • Classe finale e costruttore privato (buono ma non essenziale)
  • metodi statici pubblici

Non c'è nessun punto nel dichiarare la classe come static. Basta dichiarare la propria metodi static e li chiamano dal nome della classe come normale, come quella di Java Math classe.

Inoltre, anche se non è strettamente necessario per rendere il costruttore privato, è una buona idea per farlo. In occasione del costruttore privato impedisce ad altre persone di creazione di istanze della classe, quindi chiamare i metodi statici da tali istanze. (Queste chiamate funzionano esattamente lo stesso in Java, sono solo fuorviante e male la leggibilità del codice.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top