2015-11-19 4 views
6

Mi chiedevo se c'è una differenza nell'inizializzazione di oggetti come ArrayList <> e roba nella dichiarazione di campo o nel costruttore.Inizializzazione dell'elenco nella dichiarazione costruttore o campo

C'è una differenza nell'uso della memoria, nelle prestazioni o in qualcosa del genere o è completamente uguale?

Opzione 1:

class MyClass { 
    private List<String> strings = new ArrayList<String>(); 
} 

Opzione 2:

class MyClass { 
    private List<String> strings; 
    public MyClass() { 
     strings = new ArrayList<String>(); 
    } 
} 

Può essere una domanda stupida, o uno molto semplice, ma mi piace costruire fin dall'inizio, mi piace capire tutto ciò che vedo

risposta

1

È essenzialmente la stessa cosa. Farlo nel costruttore dà più controllo su di esso (per esempio costruttori diversi possono fare cose diverse) ma il risultato finale è identico.

Non vedrete differenze di prestazioni in memoria, CPU o qualsiasi altra cosa farlo in entrambi i modi.

2

C'è una differenza: quando si verifica l'inizializzazione. I campi vengono inizializzati per primi, quindi il costruttore si attiva.

Nel tuo semplice esempio, non ci sarebbe alcuna differenza pratica, ma se un altro campo dipendesse dal campo Elenco per l'inizializzazione, la versione del costruttore esploderebbe con un NPE.

considerare:

private List<String> strings = Arrays.asList("foo", "bar"); 
private String stringsDescription = strings.toString(); 

Se hai spostato l'inizializzazione del strings al costruttore, l'inizializzazione di stringsDescription esploderebbe con un NPE.