2016-03-31 13 views
0

私はプログラマーの多くは他のクラスからプライベートでいくつかのクラスのフィールドにアクセスするためのアクセサメソッドを使用しますが、私は、なぜ思っていた知っています。なぜ彼らは保護されたフィールドの魔法使いを好まないのですか?アクセサの代わりに同じパッケージのクラスからのみアクセスできますか?深刻な理由がなければ、それは単なるコードの無駄です。のJava:アクセサメソッド対保護フィールド

+1

あなただけの*アクセスする*必要があるフィールドに対してアクセサを使用する必要があります。'protected'は、単純に、アクセシビリティを拡張し、あなたは(必要に応じて自分でコードを壊すことなく周囲にフィールドを移動できるようにすること)ではなく、フィールドの' protected'ゲッターを使用して検討すべきです。いくつかの開発者は、この理由ですべてのフィールドを非公開にしていると感じています。実際には、アクセサーを避けて、代わりにその状態にアクセスする必要がある理由*理由*を見つける必要があります。理由を見つけたら、その理由を動作にカプセル化します。ゲッタはカプセル化を解除する簡単な方法です。 –

答えて

1

あなただけのフィールドにアクセスするためのメソッドを定義するとき、あなたは方法によって制限されています。あなたは方法がないことをすることはできません。

public class Account { 
    private int balance = 0; 

    public int getBalance() { 
     return balance; 
    } 

    public void insert(int amount) { 
     if(amount > 0) { 
      balance += amount; 
     } 
    } 

    public void withdraw(int amount) { 
     if(amount > 0 && amount =< balance) { 
      balance -= amount; 
     } 
    } 
} 

あなたが挿入し、引き抜くことにより、口座の残高を変更することができ、そしてあなたはそれが何であるかを確認することができます。

は、このクラスを検討してください。さらに、保護された

Account acc = new Account(); 
acc.balance = -10; 

が民間よりも国民に実際に近いです:あなたは直接のバランスへのアクセスを持っていた場合でも、次のようなことができると想定されていない何かを行うことができます。あなたがプライベートフィールドを持っている場合、それは永遠にプライベートになります。フィールドが保護されている場合は、誰でもクラスを拡張してフィールドにアクセスできます。プライベートなことを意図しているとあなたが保護さに設定した場合、誰かがそれを拡張するとき、それはその目的を失うかもしれない(と彼の新しいクラスは、スーパークラスの精神で行動していないため、彼はもはや拡張という事実は、意味があります)。アクセサ/ミューテータメソッドを使用して

1

ゲッターやセッターのようなmutuator方法はprotected変数と同じものではありません。

保護された変数がアクセスまたはアクセス権を持っているが、mutuatorがブリッジとして機能して、基本的なメンバー属性への変更やアクセスを傍受することができます。値を返す/設定することとは異なる動作を提供します。彼らはまったく同じ目的を果たさない。

mutuatorに加えて、privateメンバー変数に読み取り専用または書き込み専用アクセスを提供できますが、protectedフィールドでは実行できません。

0

は、他の言語としてのJavaプログラミングにおける一般的なベストプラクティスです。

Wikipediaが示唆:

ミューテータメソッドは、ほとんどの場合、カプセル化の原則を踏まえて、オブジェクト指向プログラミングで使用されています。この原則によれば、クラスのメンバ変数は非公開にされ、他のコードからそれらを隠して保護し、パブリックメンバ関数(mutatorメソッド)によってのみ変更することができます。それを変更し、プライベートメンバー変数を変更します。

ですから、(存在する場合)のロジックを隠すためにアクセサを使用するには、プライベート変数の値を設定または取得する前に適用されます。

protected代わりに、公にアクセス可能であるとは考えられないが、サブクラスによって継承され可視である変数(またはメソッド)をマークするために、修飾子を使用する必要があります。サブクラスは、この変数をメソッドで使用したり、必要に応じてアクセッサを介して公開することができます。

関連する問題