2011-11-15 6 views
5

Javaの便利な機能は、メンバメソッドをfinalとして宣言し、子孫クラスでオーバーライドできないようにするオプションです。メンバー変数に似たものがありますか?Java:メンバー変数のオーバーライドを防止する

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:申し訳ありませんが、私はシナリオにもっと詳しく説明する必要があります私は子クラス(したがって、それはプライベートであってはならない)によって更新されなければならない親クラス内の変数を、持っています。子クラスに同じ名前の変数を作成する場合は、それはそれは、自身のコピーを更新していても、それは親の変数を更新したと思います。

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 
    } 
} 

これは私がないようにしたいものです。

+2

それを維持しますか? – soulcheck

答えて

9

変数privateを宣言し、getterを使用します。

+0

カプセル化を保持するには、変数をprivateと宣言することをお勧めします。サブクラスがアクセスできるようにする場合は保護されていますが、ここではそうではありません。しかし、公衆ではない、決して。 – Guillaume

+0

保護された場合でも、プライベート変数と保護されたアクセサを使用することをお勧めします。 – Puce

+0

この変数を子クラスで更新する必要があります。私の編集を参照してください。 –

4

は、彼らが最終的なアクセサを持つ民間の仕事を行うことはありません作るprivate

+0

この変数を子クラスで更新する必要があります。私の編集を参照してください。 –

関連する問題