在public類中使用訪問方法,而非公有域
這標題看起來真晦澀。。解釋一下就是,如果類變成public的了--->那就使用getter
和setter
,不要用public成員。 要注意它的前提,如果是private的class(內部類..)或者package-private(default)的就無所謂。
退化類
退化類是只有實例域沒有任何方法的類, 比如:
class Point {public double x;public double y;
}
復制代碼
退化類應該是私有的或者是包級私有(package-private)的,因為退化類違反了面向對象的封裝原則,暴露了實例域,所以要控制這種類的訪問級別。 具體點說,如果退化類是公有的,一旦發布出去就再也不可以修改,比如把x改為a都是不可以的,因為會影響到其他使用該退化類的類(*筆者注:所以說如果代碼只有你一個人用,不用發布,也就不存在封裝)。
EJ上說,如果類可以在它所在的包外部進行訪問,就提供訪問方法。以保留將來改變該類內部呈現的靈活性(to preserve the flexibility to change the class’s internal representation.)。如果共有類暴露了數據域,將來改變 內部呈現就不可能了,因為client code已經被傳播出去了。
在類需要public或者protect的訪問級別時,應該把實例域變為private的,然后添加get和set方法。
另外,如果field是不可變的(final),那危害就小一些。
知乎上的一個回答: 來源:知乎 作者:仲晨鏈接:https://www.zhihu.com/question/21401198/answer/18113707
**的確可以暴露,如果1. 所有內外代碼都是你自己寫;2. 這個模塊再也不改了;3. 不會繼承它,或者繼承但不改變語義。**David John Wheeler有一句名言:“All problems in computer science can be solved by another level of indirection.”getter、setter就是個很好的中間層。直接摘錄stackoverflow上一個不錯的總結:oop - Why use getters and setters?**這兩個方法可以方便增加額外功能(比如驗證)。 內部存儲和外部表現不同。 可以保持外部接口不變的情況下,修改內部存儲方式和邏輯。 任意管理變量的生命周期和內存存儲方式。 提供一個debug接口。 能夠和模擬對象、序列化乃至WPF庫等融合。 允許繼承者改變語義。 可以將getter、setter用于lambda表達式。(大概即作為一個函數,參與函數傳遞和運算) getter和setter可以有不同的訪問級別。