JavaRush /Java Blog /Random-TW /吸氣劑和破損的封裝
Vadelic
等級 14
Пасадена

吸氣劑和破損的封裝

在 Random-TW 群組發布
在解決問題時,我遇到了吸氣劑的意外行為。在這裡的講座中,甚至在 IntelliJ IDEA 生成的 getter 中,都使用了最簡單的方案: public final class A { private A field; public A getField() { return field; } public void setField(A field) { this.field = field; } } 如果字段是原始類型或 String,按值傳遞,那麼一切都很好,但如果物件是按引用傳遞,那麼事實證明,透過getter,您可以獲得對該欄位的完全存取權限,這使得設定的受保護存取等級無效。如果setter包含任何有效性條件,那麼可以透過這樣​​的getter繞過它,這違反了封裝性,並且創建物件的克隆以避免這種麻煩是正確的。我知道並非所有物件都可以輕鬆克隆,如果這是由程式設計師負責的,那麼奇怪的是為什麼講座中沒有提到這一點。UPD:吸氣劑作為一個想法,當然不會違反封裝,但它的編寫方式必須不違反 OOP 原則。這意味著,如果 getter 產生一個對象,那麼使用者無法以類別中指定的任何其他方式更改它。Collections 類別中有一個很棒的方法 可以產生唯讀集合。這施加了許多其他限制,例如,不可能進行排序,但對於這種情況,此類具有: unmodifyingSortedSet unmodifyingSortedMap 以及其他一些限制,以提供更大的便利。 public static Collection unmodifiableCollection(Collection c)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION