2010-11-15 11 views
12

Sto creando un modello bancario e una classe Account ha un campo AccountNumber. Il numero di conto non dovrebbe mai cambiare, ma non posso impostare il campo come finale perché questo impedirà al costruttore di impostarlo.Posso rendere una variabile finale dopo che è stata dichiarata?

Se non è possibile farlo, non importa. È solo per un incarico di CS, quindi voglio essere certo di farlo nel modo migliore possibile.

La migliore implementazione sarebbe semplicemente quella di rendere privati ​​il ​​campo e il suo metodo di setter?

+4

"ciò impedirà al costruttore di impostarlo." Sei sicuro di questo? http://stackoverflow.com/questions/677595/initialize-final-variable-before-constructor-in-java – kasten

+0

È fantastico, non sapevo che potessi farlo: D – Matt

+0

Non puoi cambiare la variabile statica finale da un costruttore , perché la variabile statica è una per molte istanze. Ma la variabile finale può essere inizializzata all'interno del costruttore. –

risposta

23

Il costruttore può impostarlo se è contrassegnato come final ad es. Quello che segue è legale:

public class BankAccount { 

    private final int accountNumber; 

    public BankAccount(int accountNumber) { 
     this.accountNumber = accountNumber; 
    } 

} 

Infatti se un campo è contrassegnato come final ma non inizializzata nella sua dichiarazione allora deve essere impostato in tutti i costruttori.

Se non si imposta un setter pubblico sulla classe, il numero di conto non può essere modificato dall'esterno della classe, ma contrassegnandolo come finale si eviterà anche che (accidentalmente) venga modificato da qualsiasi metodo all'interno della classe.

+1

Se si dichiara qualcosa come private final String accountNumber = null il compilatore si lamenterà. – Todd

+1

@Todd, corretto. Una volta impostato su 'null', la variabile finale non può essere riassegnata. Tuttavia se la dichiarazione è solo 'private final String accountNumber;' allora puoi assegnare il suo valore nel costruttore. – mikej

+0

il commento era destinato all'interrogante. Pensavo che potesse essere il problema che stava avendo. – Todd

4

Se una variabile è final, è possibile (e deve) essere inizializzata nel costruttore.

+0

Quindi se dichiaro il campo come "private final accountNumber;" e quindi inizializzarlo nel costruttore come "accountNumber = 1234", che funzionerà? E posso farlo SOLO nel costruttore? – Matt

+0

Sì. Tutte le finali devono essere impostate in tutti i costruttori. –

+4

Questo non è del tutto vero, davvero. Un campo finale può essere inizializzato dove è dichiarato, in un blocco di inizializzazione dell'istanza o in un costruttore. Un campo finale statico può essere inizializzato dove è dichiarato o in un blocco di inizializzazione statico. – ColinD

Problemi correlati