2010-11-15 9 views
12

Estoy creando un modelo bancario y una clase Cuenta tiene un campo accountNumber. El número de cuenta nunca debe cambiar, pero no puedo establecer el campo como definitivo porque esto evitará que el constructor lo configure.¿Puedo hacer una variable final después de haber sido declarada?

Si no es posible hacer esto, no importa. Es solo para una tarea de CS así que quiero asegurarme de hacerlo lo mejor posible.

¿La mejor implementación sería hacer que el campo y su método setter sean privados?

+4

"esto evitará que el constructor lo configure". ¿Está usted seguro de eso? http://stackoverflow.com/questions/677595/initialize-final-variable-before-constructor-in-java – kasten

+0

Eso es increíble, no sabía que podía hacer eso: D – Matt

+0

No puede cambiar la variable estática final desde dentro de un constructor , porque la variable estática es una para muchas instancias. Pero la variable final puede inicializarse dentro del constructor. –

Respuesta

23

El constructor puede configurarlo si está marcado como final p. Ej. la siguiente es legal:

public class BankAccount { 

    private final int accountNumber; 

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

} 

De hecho, si un campo está marcado como final pero no inicializado en su declaración, entonces debe ajustarse en todos los constructores.

Si no pone un setter público en la clase, el número de cuenta no se puede cambiar desde fuera de la clase, pero marcarlo como final también evitará que (accidentalmente) se modifique con cualquier método dentro de la clase.

+1

Si declara algo así como el final privado String accountNumber = null, el compilador se quejará. – Todd

+1

@Todd, correcto. Una vez configurado en 'null', la variable final no puede ser reasignada. Sin embargo, si la declaración es solo 'private final String accountNumber;', entonces puede asignar su valor en el constructor. – mikej

+0

el comentario fue dirigido al interrogador. Pensé que ese podría ser el problema que estaba teniendo. – Todd

4

Si una variable es final puede (y debe) inicializarse en el constructor.

+0

Así que si declaro el campo como "private final accountNumber;" y luego inicializarlo en el constructor como "accountNumber = 1234", ¿funcionará? ¿Y SÓLO puedo hacer eso en el constructor? – Matt

+0

Sí. Todas las finales deben establecerse en todos los constructores. –

+4

Esto no es del todo cierto, de verdad. Un campo final se puede inicializar donde se declara, en un bloque de inicialización de instancia o en un constructor. Un campo final estático se puede inicializar donde se declara o en un bloque de inicialización estático. – ColinD

Cuestiones relacionadas