在List.of() or Collections.emptyList()和List.of(...) or Collections.unmodifiableList()给出的评论和答案的上下文中,我提出了以下两条经验法则(也适用于Set
和Map
工厂相应地)。
继续使用Collections.emptyList()
以提高可读性,例如初始化惰性字段成员,如:
class Bean {
private List<Bean> beans = Collection.emptyList();
public List<Bean> getBeans() {
if (beans == Collections.EMPTY_LIST) { beans = new ArrayList<>(); }
return beans;
}
}
在使用List.of()
参数调用可执行文件时,使用新工厂List
和变体作为快速且较少到类型的版本。以下是我目前的替代模式:
Collections.emptyList() --> List.of()
Collections.singletonList(a) --> List.of(a)
Arrays.asList(a, ..., z) --> List.of(a, ..., z)
在Collections.indexOfSubList
的虚构用法中,以下行
Collections.indexOfSubList(Arrays.asList(1, 2, 3), Collections.emptyList());
Collections.indexOfSubList(Arrays.asList(1, 2, 3), Collections.singletonList(1));
Collections.indexOfSubList(Arrays.asList(1, 2, 3), Arrays.asList(1));
Collections.indexOfSubList(Arrays.asList(1, 2, 3), Arrays.asList(2, 3));
Collections.indexOfSubList(Arrays.asList(1, 2, 3), Arrays.asList(1, 2, 3));
将阅读
Collections.indexOfSubList(List.of(1, 2, 3), List.of());
Collections.indexOfSubList(List.of(1, 2, 3), List.of(1));
Collections.indexOfSubList(List.of(1, 2, 3), List.of(1));
Collections.indexOfSubList(List.of(1, 2, 3), List.of(2, 3));
Collections.indexOfSubList(List.of(1, 2, 3), List.of(1, 2, 3));
你(不同意)吗?
答案 0 :(得分:7)
首先,重要的是要注意集合工厂返回不可变的变体。不幸的是,这不会在类型系统中显示,因此您必须手动/精神跟踪。这已经禁止了一些可能值得的替换,因此它必须在您的规则列表中变为 0。。 :)
例如,创建稍后由其他代码修改的种子元素集合可能如下所示:
private final Set<String> commonLetters = initialCommonLetters()
private static Set<String> initialCommonLetters() {
Set<String> letters = new HashSet<>();
letters.add("a");
letters.add("e");
return letters;
}
简单地编写commonLetters = Set.of("a", "e");
会很棒,但这可能会破坏其他代码,因为返回的集合是不可变的。
(im)可变性讨论会立即导致常数。这是介绍它们的主要原因!您需要静态初始化程序块来创建COMMON_LETTERS
常量的日子已经一去不复返了。因此,这将是我首先查看用例的地方。
正如您所说,似乎没有理由开始替换Collections::empty...
,Collections::singleton...
或Arrays::asList
的来电,只是为了它的乐趣。但是,一旦我开始在类中使用新方法,我会做的就是替换旧的变体,让代码依赖于更少的概念,使理解变得更容易。
最后一个参数也可以适用于of()
变体。虽然Collections::empty...
和Collections::singleton...
对于他们的意图有点清楚,但我倾向于总是使用of
,无论你有多少个参数,都可以通过编写代码来抵消这种优势,一个整体,使用较少的概念。
我认为没有理由继续使用Arrays::asList
。