java中的不可修改列表

时间:2013-05-03 09:57:32

标签: java list arraylist unmodifiable

我正在尝试设置List无法修改。

在我的代码中,我有一个返回列表的方法。

不应修改此列表,但我不想捕获unmodifiableList返回的异常。

private List<T> listeReferenceSelectAll = null;
List<T> oListeRet = new ArrayList<T>();
oListeRet = listeReferenceSelectAll;
return new ArrayList<T>(oListeRet);

这是一个现有的代码,我必须将其转换为返回不可修改的列表,但如果调用了“add”方法,则不必捕获任何异常。

首先,我创建了一个实现List的类,以覆盖“add”方法来记录异常,而不是捕获它。

但我不知道如何正确地实例化它......

7 个答案:

答案 0 :(得分:60)

您需要java.util.Collections

return Collections.unmodifiableList(oListeRet);

如果必须自己编写,请让该类实现List接口,并为修改内容的方法抛出异常。

答案 1 :(得分:17)

Collections.unmodifiableList

  

返回指定列表的不可修改视图。这种方法允许   模块为用户提供对内部列表的“只读”访问。   对返回列表的查询操作“通读”到指定的   列表,并尝试修改返回的列表,无论是直接还是通过   它的迭代器,导致UnsupportedOperationException。归来了   如果指定的列表是可序列化的,则list将是可序列化的。   同样,返回的列表将实现RandomAccess   指定的清单。

答案 2 :(得分:6)

if (pictureBox.Visible && (pictureBox.Top <= ball.Bottom && pictureBox.Bottom >= ball.Top && ball.Left <= pictureBox.Right && ball.Right >= pictureBox.Left)) { spy = -spy; pictureBox.Visible = false; } 提供了一种新方法来创建unmodifiable/immutable Java-9

List

List.of创建一个包含任意数量元素的不可变列表。

答案 3 :(得分:5)

虽然接受的答案解决了忽略/吞围UnsupportedOperationException的请求,但应该解释为什么它是一种不受欢迎的做法。

1)吞下例外的整体意图与“快速失败”相矛盾。原理。而不是早期发现和捕捉缺陷,他们只是被允许去地毯下#34;变成定时炸弹。

2)不投掷UnsupportedOperationException是直接违反List合同的原因:

Throws:
    UnsupportedOperationException - if the add method is not supported by this list.

所以对问题标题中的内容给出了正确答案:&#34; java中的不可修改列表&#34;应该仍然是:

return Collections.unmodifiableList(oListeRet);

答案 4 :(得分:4)

如果您绝对必须这样做,请尝试遵循您正在创建的列表中 java.util.List 指定的合同。

您的代码看起来像

public class UnmodifiableArrayList<E>  extends ArrayList<E> {

    public UnmodifiableArrayList(Collection<? extends E> c) {
        super(c);
    }

    public boolean add(int index) {
        return false;//Returning false as the element cannot be added 
    }

    public boolean addAll(Collection<? extends E> c) {
        return false;//Returning false as the element cannot be added 
    }

    public E remove(int index) {
        return null;//Returning null as the element cannot be removed
    }
}

在同一行添加您需要的更多方法。只需确保代码中可能用于修改的所有构造函数和方法都被覆盖,以确保列表不可修改。

使用Collections API是更简洁,更好的方法,所以只有在使用Collections.UnmodifiableList不能满足您的需要时才使用这种方式。

请记住,这将是一个噩梦,在调试时尽可能地记录。

答案 5 :(得分:0)

1)这些行毫无意义

List<T> oListeRet = new ArrayList<T>();
oListeRet = listeReferenceSelectAll;

2)使用Collections.unmodifiableList。

return Collections.unmodifiableList(oListeRet);

你不需要捕获它可能抛出的异常,它们都是UnsupportedOperationException - RuntimeExceptions

答案 6 :(得分:0)

关于不可修改列表的评论是正确的。创建一个调用Collections.unmodifiableList的方法访问器。但是,您可能只想使用这样的数组,并在内部使用列表。

 public MyObject[] getObjects() {
    return (MyObject[]) mList.toArray();
 }