我正在尝试设置List
无法修改。
在我的代码中,我有一个返回列表的方法。
不应修改此列表,但我不想捕获unmodifiableList返回的异常。
private List<T> listeReferenceSelectAll = null;
List<T> oListeRet = new ArrayList<T>();
oListeRet = listeReferenceSelectAll;
return new ArrayList<T>(oListeRet);
这是一个现有的代码,我必须将其转换为返回不可修改的列表,但如果调用了“add”方法,则不必捕获任何异常。
首先,我创建了一个实现List的类,以覆盖“add”方法来记录异常,而不是捕获它。
但我不知道如何正确地实例化它......
答案 0 :(得分:60)
您需要java.util.Collections
:
return Collections.unmodifiableList(oListeRet);
如果必须自己编写,请让该类实现List
接口,并为修改内容的方法抛出异常。
答案 1 :(得分:17)
返回指定列表的不可修改视图。这种方法允许 模块为用户提供对内部列表的“只读”访问。 对返回列表的查询操作“通读”到指定的 列表,并尝试修改返回的列表,无论是直接还是通过 它的迭代器,导致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();
}