私はプログラマーの多くは他のクラスからプライベートでいくつかのクラスのフィールドにアクセスするためのアクセサメソッドを使用しますが、私は、なぜ思っていた知っています。なぜ彼らは保護されたフィールドの魔法使いを好まないのですか?アクセサの代わりに同じパッケージのクラスからのみアクセスできますか?深刻な理由がなければ、それは単なるコードの無駄です。のJava:アクセサメソッド対保護フィールド
答えて
あなただけのフィールドにアクセスするためのメソッドを定義するとき、あなたは方法によって制限されています。あなたは方法がないことをすることはできません。
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;
が民間よりも国民に実際に近いです:あなたは直接のバランスへのアクセスを持っていた場合でも、次のようなことができると想定されていない何かを行うことができます。あなたがプライベートフィールドを持っている場合、それは永遠にプライベートになります。フィールドが保護されている場合は、誰でもクラスを拡張してフィールドにアクセスできます。プライベートなことを意図しているとあなたが保護さに設定した場合、誰かがそれを拡張するとき、それはその目的を失うかもしれない(と彼の新しいクラスは、スーパークラスの精神で行動していないため、彼はもはや拡張という事実は、意味があります)。アクセサ/ミューテータメソッドを使用して
ゲッターやセッターのようなmutuator方法はprotected
変数と同じものではありません。
保護された変数がアクセスまたはアクセス権を持っているが、mutuatorがブリッジとして機能して、基本的なメンバー属性への変更やアクセスを傍受することができます。値を返す/設定することとは異なる動作を提供します。彼らはまったく同じ目的を果たさない。
mutuatorに加えて、private
メンバー変数に読み取り専用または書き込み専用アクセスを提供できますが、protected
フィールドでは実行できません。
は、他の言語としてのJavaプログラミングにおける一般的なベストプラクティスです。
Wikipediaが示唆:
ミューテータメソッドは、ほとんどの場合、カプセル化の原則を踏まえて、オブジェクト指向プログラミングで使用されています。この原則によれば、クラスのメンバ変数は非公開にされ、他のコードからそれらを隠して保護し、パブリックメンバ関数(mutatorメソッド)によってのみ変更することができます。それを変更し、プライベートメンバー変数を変更します。
ですから、(存在する場合)のロジックを隠すためにアクセサを使用するには、プライベート変数の値を設定または取得する前に適用されます。
protected
代わりに、公にアクセス可能であるとは考えられないが、サブクラスによって継承され可視である変数(またはメソッド)をマークするために、修飾子を使用する必要があります。サブクラスは、この変数をメソッドで使用したり、必要に応じてアクセッサを介して公開することができます。
- 1. クラス内のJavaフィールドとアクセサメソッド
- 2. 対称鍵の保護
- 3. Java EE Webページの保護
- 4. Javaの保護情報
- 5. 他のクラスの保護フィールドへのアクセス
- 6. Javaの保護は保護されません
- 7. C#保護されたフィールドへのアクセス
- 8. 個々のDBフィールドを保護する
- 9. Javaクライアント.classファイル保護
- 10. Java:保護された、visibitily
- 11. sqliteはフィールド名を保護する
- 12. ユーザテキストアーム入力に対する保護
- 13. 配布用のJava jarファイルの保護
- 14. C#保護されたreadonly autopropertyと取得アクセサーと保護されたreadonlyフィールド
- 15. Javaで保護されたメソッドのモックオブジェクト
- 16. Javaリフレクションによるパッケージと保護された保護の比較
- 17. パスワードの保護フォームの保護
- 18. Word文書の保護/保護解除
- 19. デフォルトのRubyアクセサメソッド?
- 20. Javaで保護されているとマークされたフィールドを持つScalaクラス
- 21. Java/Hibernate Criteria Query APIはインジェクションに対して保護されていますか?
- 22. ファイルパスワードをJavaで保護する
- 23. Java、JFileChooser&Windowsネットワーク共有とパスワード保護
- 24. デコンパイルからJavaコードを保護または保護する方法
- 25. クラウドFirestoreのセキュリティルール - ドキュメント内の単一の保護フィールド
- 26. アングルアプリケーションの保護
- 27. ソースコードの保護
- 28. csrfの保護
- 29. レストエンドポイントの保護
- 30. Javascriptの保護
あなただけの*アクセスする*必要があるフィールドに対してアクセサを使用する必要があります。'protected'は、単純に、アクセシビリティを拡張し、あなたは(必要に応じて自分でコードを壊すことなく周囲にフィールドを移動できるようにすること)ではなく、フィールドの' protected'ゲッターを使用して検討すべきです。いくつかの開発者は、この理由ですべてのフィールドを非公開にしていると感じています。実際には、アクセサーを避けて、代わりにその状態にアクセスする必要がある理由*理由*を見つける必要があります。理由を見つけたら、その理由を動作にカプセル化します。ゲッタはカプセル化を解除する簡単な方法です。 –