2011-12-07 3 views
7

Questa domanda ha una leggera enfasi su Java ma si applica a qualsiasi linguaggio OO. È buona norma inizializzare le variabili di classe nelle loro dichiarazioni? Mi sembra ovviamente così. Riduce al minimo il rischio di errori di errore di puntatore nullo sciocco.Best practice per l'inizializzazione degli attributi degli oggetti in OO Languages ​​

Ad esempio:

class myClass{ 

    private String name = "";// initialize here 

    public myClass(){ 

    //something 

    } 
} 

Ma in alcuni libri di testo non si preoccupano per inizializzare immediatamente. Che è migliore? Importa?

+0

Questa non è una variabile di classe, è una variabile di istanza. –

+3

In che modo un NPE è peggio del valore inizializzato, ma con un valore errato o non valido? –

+0

Il segno è corretto. Una NullPointerException è meglio che fallire silenziosamente con un valore errato. –

risposta

5

Un caso in cui è meglio non inizializzare in linea è dove si hanno più costruttori che inizializzano i campi in modi diversi. Sarebbe inefficiente inizializzare il campo alla dichiarazione e quindi sostituire quel valore con un valore passato a un costruttore specifico in un secondo momento.

3

Questo è venuto ripetutamente su SO, quindi è necessario cercare nel sito per ulteriori pareri.

Il mio suggerimento per Java (questo ha senso solo in alcune lingue):

Se il valore iniziale è fissato per la classe, poi inizializzare linea.

Se diversi costruttori impostano valori iniziali diversi, assegnare i valori nel rispettivo costruttore.

In C++ 11 la situazione è in qualche modo simile.

0

Dipende totalmente da come la classe è destinata a essere utilizzata.

Un esempio potrebbe essere per le classi di valore, che potresti spesso voler essere immutabili. Idealmente in questo caso dovresti impostare i valori nel costruttore.

public final class Foo { 
    private final String foo; 
    public Foo(String foo) { 
     this.foo = foo; 
    } 
} 

Se esistono valori predefiniti veramente sensibili, è possibile fornire questi al punto di dichiarazione. Tende a rendere abbastanza facile vedere qual è il valore predefinito previsto. Ovviamente, questo non funziona con i campi finali (come sopra), poiché non è possibile assegnare un altro valore.

Un'altra considerazione riguarda i meriti relativi dell'inizializzazione del costruttore o del mutatore. L'utilizzo dell'inizializzazione del costruttore garantisce che l'istanza non si trovi mai in uno stato incoerente, mentre l'inizializzazione del mutatore è spesso più flessibile e fornisce un'API più semplice.

Nell'osservazione iniziale per evitare NPE s, direi che è meglio affrontarla utilizzando l'inizializzazione del costruttore, lungo le linee del codice precedente.