我正在寫一個代表一些簡單幾何的Java類。爲什麼使用private修飾符來實現不可變的final實例var?
在最上面的abstract
類(本身是包私人)我已聲明屬性,我需要從同一包中的子類訪問。
如果我宣佈爲final
在AbstractClass
屬性,
final int foo;
我就能夠訪問它直接在包裝,沒有一個getter方法的任何大驚小怪。 但是。根據「實踐」(或什麼,我認爲這是常見的款式)會做:
private final int foo;
這當然需要一個非private
吸氣。子類必須參考foo
(這是一個非常相關的,典型的屬性),就好像它是一些外部對象:
this.getFoo();
它增加了代碼,並刪除訪問這些成員的直接的方式(即foo
)。
是否有跳過private
修飾符的缺點,因爲它們無論如何都是最終的,我不擔心在包內部公開這些屬性?
我知道OO倡導者聲稱getters/setters是對象訪問自己屬性的一種非常自然的方式 - 但是什麼時候這會使得任何非美化的,非[插入任何JavaBeans風格的東西], 區別?
考慮一個內部類,Coordinate
,它是如此的簡單,因爲它有兩個int
屬性 - 使所有使用情況OuterClass
類:
class OuterClass{
final static class Coordinate{
final int x, y;
Coordinate(int x, int y){
this.x = x;
this.y = y;
}
}
Coordinate coordinate;
}
對於這個內部類 - 爲什麼我要與創建的實踐打擾一個吸氣? 一個吸氣器會引入更多的代碼,並強制任何一個類在同一個包中調用coordinate.getX();
而不是簡單的coordinate.x;
。這裏有什麼開銷?請注意類Coordinate
上的final
修飾符。
有一些人誰得到所有的熱,如果你允許對象外的對象的字段的任何訪問打擾。對這些人來說,這是有所作爲的。對其他人而言,不。 –
@HotLicks:這實際上是我最大的擔憂:) atm對於我的實現來說當然沒有意義。但我也渴望根據所有偉大的編碼員實踐進行編碼。 我的意思是,因爲它是FINAL,所以只能在查看變量時訪問(package-private),而不是使用getter - 這怎麼會是錯誤的?特別是當直接看時產生更少的醜陋感覺。 – tortal
有一個擔心,如果類的內部隨着時間的推移發生變化,可能需要刪除直接訪問並使用訪問方法。在某些情況下(例如廣泛使用的應用程序的主要公共接口),這是一個現實的問題,但在大多數情況下很少關注。直接方法的簡單性(因此更少的錯誤)可能輕而易舉地超過該關注點。 –