是否有可能找出某个列表是否固定大小?我的意思是,例如这段代码:
String[] arr = {"a", "b"};
List<String> list = Arrays.asList(array);
Run Code Online (Sandbox Code Playgroud)
返回List由数组支持的固定大小.但是,如果List是固定大小而不尝试添加/删除元素并捕获异常,是否有可能以编程方式理解?例如:
try {
list.add("c");
}
catch(UnsupportedOperationException e) {
// Fixed-size?
}
Run Code Online (Sandbox Code Playgroud)
chr*_*con 14
从String[]by 创建的列表
List<String> list = Arrays.asList(array);
Run Code Online (Sandbox Code Playgroud)
将具有Arrays封闭类,而由例如创建的new ArrayList()类将不具有封闭类.因此,以下内容应该用于检查List是否是由于调用而产生的Arrays.toList():
static <T> boolean wasListProducedAsAResultOfCallingTheFunctionArrays_asList(List<T> l) {
return Arrays.class.equals(l.getClass().getEnclosingClass());
}
Run Code Online (Sandbox Code Playgroud)
请注意,此方法依赖于未记录的行为.如果他们将另一个嵌套的List子类添加到Arrays类,它将会中断.
有可能找出一些列表是否固定大小?
理论上 - 否.固定大小是列表类实现的新兴属性.您只能通过尝试添加元素来确定列表是否具有该属性.
请注意,简单的行为测试无法可靠地区分固定大小的列表和有界列表或永久或临时只读的列表.
在实践中,固定大小的列表通常具有与普通列表不同的类.您可以测试对象的类,以查看它是否是特定的类.因此,如果您了解将在代码库中使用哪些类来实现固定大小的列表,那么您可以测试特定列表是否是固定大小的.
例如,该Arrays.asList(...)方法返回一个List实际类为的对象java.util.Arrays.ArrayList.这是一个私有嵌套类,但你可以使用反射找到它,然后用Object.getClass().equals(...)它来测试它.
但是,这种方法很脆弱.如果Arrays修改了实现,或者您开始使用其他形式的固定大小列表,您的代码可能会中断.