簡體   English   中英

沒有“直接訪問”的Java ArrayList

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM