encapsulation使用private
字段與訪問者(獲取者和設置者)而不是protected
和public
字段被認爲是最佳實踐。「保護」和「公共」可見性對班級領域無用嗎?
因此,通過遵循此最佳做法,我們再也不會使用protected
和public
。它們變得毫無用處,否則它們的用例是什麼?
我能想到的唯一的事情是公開的static final
屬性(即類常量)。
注意:這是至少在Java世界強烈的情況,但問題代表所有語言。
encapsulation使用private
字段與訪問者(獲取者和設置者)而不是protected
和public
字段被認爲是最佳實踐。「保護」和「公共」可見性對班級領域無用嗎?
因此,通過遵循此最佳做法,我們再也不會使用protected
和public
。它們變得毫無用處,否則它們的用例是什麼?
我能想到的唯一的事情是公開的static final
屬性(即類常量)。
注意:這是至少在Java世界強烈的情況,但問題代表所有語言。
最佳實踐可以隨時間變化。
我可以在兩個用於公共領域的用例中思考,這兩個用例都有些爭議。
Adam Bien說in this post如果你使用的是DTO,你不能使用私人+ getter + setter,而只能使用公共字段。通過這種方式,您可以確保數據按原樣傳輸,無需任何更改。但他補充說,這將花費你很多會議解釋你爲什麼這樣做......
非常量公共字段的另一個用途是使用公共final字段(在構造函數中初始化)以確保不變性。讓您的類,如
public Person{
public final String lastName;
public final String firstName;
public Person(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
}
是某種一個新的最佳實踐,在地方建議像codemonkeyism的。
但除非你是代碼的絕對擁有者和/或可強制新標準得到滿足,你應該保持避免使用公共/保護領域的...
關於DTO非常有趣的觀點。 DTO課程通常太糟糕了。 – 2012-03-28 17:41:44
codemonkeyism鏈接已損壞 – Andy 2015-06-20 14:48:41
就內部字段而言?是的,在很多情況下它們是無用的。 (如果你期望有子類,有時protected
是可以接受的)。而且public static final
屬性也完全沒問題。
也就是說,public
和protected
方法是絕對必要的。
那麼,我仍然看到很多public static final
字段,這對我來說是有意義的 - 因爲它們是常量。除此之外(還有一些protected
個案 - 但需要時刻小心),我認爲這是非常罕見的(並且您應該有一些很好的理由,至少在製作字段public
而不是final
時我想不出來) 。不過,我也認爲使用getter/setter應該限制在最小的不可缺少的地方 - 我在過去看到人們把getter放在每一個領域 - 即使不需要。
某些時候有內部常量只允許子類使用,那麼您可能需要protected
修飾符,而不是爲那些常量創建getter。 這適用於允許子類直接訪問的字段,它不會暴露給外部。
「無用」在旁觀者眼中。一些「最佳實踐」被高估:
假設您需要C風格結構的等價物,基本上這是一個只包含一堆數據的無方法類。只有擁有公共領域的班級比擁有一羣獲得者和制定者的班級更確實更方便和更易讀。
假設您想要訪問一個永不改變的值(如數組的長度),public final
字段對此非常合適。此外,有一個「常量」類,除了public static final
字段外,其他類都很常見。有無數標準庫類與public static final
領域。實際上,幾乎每一次你想要一個公共的常量都是可以使用的。
protected
字段是非常罕見的,雖然,AFAIK。你真的需要計劃讓一個子類具有遠見並且需要使用protected
。
「每次你想要一個公共的常量時,都要使用」=>取決於常量是什麼,枚舉可能是更好的選擇。 – assylias 2012-03-28 15:36:41
好點。實際上,在標準庫中有很多'public static final'的用法,如果它們是枚舉,它們可能看起來更好。 – trutheality 2012-03-28 15:42:20
公共,私人,保護和包裝不限於領域。
在方法和構造函數中使用了很多有用的應用程序。
但是,嘗試將字段限制爲專用範圍將會不一致,因爲在嵌套/內部類的情況下java不能這樣做。
工程「最佳實踐」是指一般指導原則。在所有情況下,使用getter和setter都不是最好的。例如,如果要創建BST,那麼將Node類的字段聲明爲public(即數據,左側,右側)要簡單得多。 BST中的方法因此更易於讀取和寫入。再次因爲在某些情況下直接訪問更簡單,您可以使用protected來直接訪問子類,同時拒絕訪問公衆。
我與你的前提不同意。通過'受保護的'可見性將成員變量暴露給子類是有合法理由的。 – Richard 2012-03-28 15:28:57
@Richard我很想知道*何時使用'protected'並仍然遵循最佳實踐/編寫美觀和優美的代碼。我過去曾經使用它,但似乎沒有強烈的理由去做,除了因爲它更容易,我實現了父類和子類。 – 2012-03-28 15:36:01
@Matthieu實質上,受保護字段的使用總是可以由受保護的getter/setter +專用字段替代。 – assylias 2012-03-28 15:48:23