[英]Java ArrayList without “direct access”
我有一個實例屬性
private ArrayList<String> list;
這是由構造函數設置的。 我想阻止此列表包含空值,所以我為列表編寫了自己的add()
和remove()
方法,並從構造函數的列表中刪除所有null元素。
現在沒有人應該直接訪問此列表,以防止它們只是添加null。
public class TestList {
private ArrayList<String> list;
public TestList(ArrayList<String> list) {
while (list.remove(null));
this.list = list;
}
public List<String> getList() { //Just for the test code
return list;
}
public boolean add(String e) {
if (e == null) {
return false;
}
return list.add(e);
}
public boolean remove(String e) {
return list.remove(e);
}
}
但是對於這個類,我仍然可以訪問列表,如下面的測試代碼所示。
ArrayList<String> list = new ArrayList<String>();
list.add("line0");
list.add("line1");
list.add("line2");
TestList tl = new TestList(list);
list.add(null);
System.out.println(tl.getList().toString());
控制台: [line0, line1, line2, null]
如您所見,null已添加到列表中,因為我仍然引用了類外部類中的列表。 (我不確定這個解釋是否100%正確,但原則上我理解這一點)
我解決這個問題的方法:
public class TestList {
private ArrayList<String> list;
public TestList(ArrayList<String> list) {
ArrayList<String> newList = new ArrayList<String>(list);
while (newList.remove(null));
this.list = newList;
}
public List<String> getList() { //Just for the test code
return list;
}
public boolean add(String e) {
if (e == null) {
return false;
}
return list.add(e);
}
public boolean remove(String e) {
return list.remove(e);
}
}
使用相同的代碼進行測試: [line0, line1, line2]
,現在它可以正常工作。
歡迎所有評論和提示。
您已實現了委派軟件設計模式 。
為了方便您的類的意圖,采用“安全發布”,它返回內部數據結構的副本 (雖然是一個淺拷貝):
public List<String> getList() {
return new ArrayList<>(list);
}
然后,客戶端可以使用列表執行他們喜歡的操作,而不會影響列表。
或者,您可以返回不可變列表:
public List<String> getList() {
return Collections.unmodifiableList(list);
}
如果嘗試修改它,將拋出異常。
順便說一下,從編碼風格的角度來看,你可以考慮這個“優化”:
if (e == null) {
return false;
}
return list.add(e);
可以重寫為一行:
return e != null && list.add(e);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.