[英]Private List with Getter/Setter vs Public List
將一個私有類的全局列表設為私有並具有getter和setter方法會更好,還是只公開它會更好? Java中的標准是什么?
有人教我將變量設為私有,只具有getter和setter方法,但是訪問私有列表肯定比私有列表更好。
public exampleclassThatContainsTheList.goodieList.add("Candy");
private exampleclassThatContainsTheList.setGoodieList(exampleclassThatContainsTheList.getGoodieList().add("Candy"));
那是我的觀點,但是我當然更願意按標准去做,而不是去看似好的去做。
首先,除非public
字段是常量( static final
)字段並確保其狀態不會改變,否則您不應直接使用public
字段。 應該使用封裝公開它們,以避免類的客戶端修改狀態。 這是一個通過防御性地實現getter / setter來編寫自己的框架的示例,目的是不更改List
的當前狀態:
public class Foo {
private List<String> stringList;
public Foo() {
//always initialized, never null
this.stringList = new ArrayList<>();
}
public List<String> getStringList() {
//defensive implementation
//do not let clients to alter the state of the list
//for example, avoiding clear the list through getStringList().clear()
return new ArrayList(stringList);
}
public void setStringList(List<String> stringList) {
//defensive implementation
//do not let clients to pass a null parameter
this.stringList = (stringList == null) ? new ArrayList<>() : new ArrayList<>(stringList);
}
}
除此之外, JavaBean規范指出Java類中的字段不應該是public
並且它們的訪問應該通過getter和setter方法。
7個住宿
屬性是Java Bean的離散的命名屬性,可能會影響其外觀或行為。 例如,GUI按鈕可能具有名為“ Label”的屬性,該屬性表示按鈕中顯示的文本。
屬性以多種方式顯示:
- 屬性可能在腳本環境中公開,就好像它們是對象的字段一樣。 因此,在Javascript環境中,我可以執行“ b.Label = foo”來設置屬性的值。
- 可以通過其他組件調用其getter和setter方法以編程方式訪問屬性(請參見下面的7.1節)。
(......)
7.1訪問器方法
總是通過對其擁有的對象的方法調用來訪問屬性。 對於可讀屬性,將有一種getter方法來讀取屬性值。 對於可寫屬性,將有一個setter方法來允許更新屬性值。
有些框架遵循這些規范,以允許通過反射為類字段注入/檢索值。 例如,Spring和JSF。
通過XML配置的Spring示例:
<bean id="fooBean" class="my.package.Foo">
<property name="stringList">
<list>
<value>Hello</value>
<value>World</value>
</list>
</property>
</bean>
以及相關的Java類:
package my.package;
public class Foo {
private List<String> stringList;
public String getStringList() {
return this.stringList;
}
//allows Spring to set the value of stringList through reflection
public void setStringList(List<String> stringList) {
this.stringList = stringList;
}
}
使用表達式語言進行字段綁定的JSF示例:
<!-- allows JSF to call getter through reflection -->
<h:dataTable value="#{foo.stringList}" var="value">
<h:column>
#{value}
</h:column>
</h:dataTable>
以及相關的Java類:
package my.package;
@ManagedBean
@ViewScoped
public class Foo {
private List<String> stringList;
@PostConstruct
public void init() {
stringList = new List<>();
stringList.add("Hello");
stringList.add("world");
}
public String getStringList() {
return this.stringList;
}
public void setStringList(List<String> stringList) {
this.stringList = stringList;
}
}
使用哪個選項:防御性吸氣劑/設置器或普通吸氣劑/設置器? 這將取決於您在做什么。
標准是具有私有實例變量和公共獲取/設置方法(如您所教)。 您始終希望封裝或“隱藏”數據,這是OOP的基本概念之一。 這樣做的主要好處之一是在不破壞其他正在使用同一代碼的開發人員的代碼的情況下修改我們已實現的代碼。 這種方法還將增加可維護性。
我將更進一步:
為什么有人應該知道您如何存儲數據? 信息隱藏是關鍵字。 在您的示例中,有關數據類型的詳細信息泄漏到外部。 關鍵字列表泄漏了有關實現的詳細信息,這是1)不必要的信息-您甚至可以將其命名為寶藏 2)類的可能用戶對實現進行了假設,這是一件壞事。 給您的類一個域名,例如好東西,並給方法命名,例如put / pull 。 如果要添加多個元素,我將使用更通用的接口,如Iterable 。
最好將一個類中的全局列表設為私有,並具有getter和setter方法
使用getter / setter有一些優點
要了解更多詳細信息,請通過以下鏈接
:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.