2011-11-15 15 views
5

Una funzione utile in Java è l'opzione per dichiarare un metodo membro come finale, in modo che non possa essere sovrascritto nelle classi discendenti. C'è qualcosa di simile per le variabili membro?Java: impedisce l'override di una variabile membro

class Parent { 
    public final void thisMethodMustRemainAsItIs() { /* ... */ } 
    public String thisVariableMustNotBeHidden; 
} 

class Child extends Parent { 
    public final void thisMethodMustRemainAsItIs() { /* ... */ } // Causes an error 
    public String thisVariableMustNotBeHidden; // Causes no error! 
} 

EDIT: mi dispiace, avrei dovuto elaborare più sullo scenario: ho una variabile nella classe genitore, che dovrebbe essere aggiornato da classi figlie (quindi non deve essere privata). Tuttavia, se una classe bambino crea una variabile con lo stesso nome, si penserà di aver aggiornato la variabile genitore, anche se l'aggiornamento continuo la propria copia:

class Parent { 
    protected String myDatabase = null; // Should be updated by children 
    public void doSomethingWithMyDatabase() { /* ... */ } 
} 

class GoodChild extends Parent { 
    public GoodChild() { 
     myDatabase = "123"; 
     doSomethingWithMyDatabase(); 
    } 
} 

class BadChild extends Parent { 
    protected String myDatabase = null; // Hides the parent variable! 
    public BadChild() { 
     myDatabase = "123"; // Updates the child and not the parent! 
     doSomethingWithMyDatabase(); // NullPointerException 
    } 
} 

Questo è quello che voglio evitare.

+2

Rendendoli privata con funzioni di accesso finali non farà il lavoro? – soulcheck

risposta

9

dichiarare la variabile privata e utilizzare getter.

+0

È meglio dichiarare comunque la variabile privata, per preservare l'incapsulamento. O protetto quando si desidera consentire alle sottoclassi di accedervi, che non è il tuo caso qui. Ma non pubblico, mai. – Guillaume

+0

Anche nel caso protetto consiglio di utilizzare variabili private e accessors protetti. – Puce

+0

Ho bisogno di aggiornare questa variabile nelle classi figlie - vedi la mia modifica. –

4

tenerlo private

+0

Ho bisogno di aggiornare questa variabile nelle classi figlie - vedi la mia modifica. –

Problemi correlati