JavaRush /Java Blog /Random-JA /ゲッターと壊れたカプセル化
Vadelic
レベル 14
Пасадена

ゲッターと壊れたカプセル化

Random-JA グループに公開済み
問題を解決しているときに、ゲッターの予期しない動作に遭遇しました。ここでの講義と、IntelliJ IDEA によって生成されたゲッターでも、最も単純なスキームが使用されます。 public final class A { private A field; public A getField() { return field; } public void setField(A field) { this.field = field; } } フィールドが値によって渡されるプリミティブ型または String の場合は、すべて問題ありませんが、オブジェクトが参照によって渡される場合は、その後、ゲッターを介してフィールドへの完全なアクセスを取得できることがわかり、これにより、設定された保護されたアクセス レベルが無効になります。セッターに有効性条件が含まれている場合、そのようなゲッターを介してバイパスされる可能性がありますが、これはカプセル化に違反するため、この問題を回避するにはオブジェクトのクローンを作成するのが正しいでしょう。すべてのオブジェクトを簡単に複製できるわけではないことは理解していますが、これがプログラマの責任に任されているのであれば、なぜ講義のどこにもこのことについて言及しなかったのか不思議です。UPD: もちろん、ゲッターはアイデアとしてはカプセル化に違反しませんが、OOP の原則を裏切らない方法で作成する必要があります。これは、ゲッターがオブジェクトを生成する場合、クラスで指定されている他の方法ではユーザーがそのオブジェクトを変更できないように生成することを意味します。Collections クラスには、 読み取り専用のコレクションを生成する素晴らしいメソッドがあります。これにより、並べ替えが不可能になるなど、他の多くの制限が課されますが、この場合、利便性を高めるために、このクラスには unmodifiableSortedSet unmodifiableSortedMap およびその他の制限がいくつかあります。 public static Collection unmodifiableCollection(Collection c)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION