Java 9集合工厂的用法

时间:2016-11-30 12:46:11

标签: java collections java-9

List.of() or Collections.emptyList()List.of(...) or Collections.unmodifiableList()给出的评论和答案的上下文中,我提出了以下两条经验法则(也适用于SetMap工厂相应地)。

  1. 不要替换所有事件
  2. 继续使用Collections.emptyList()以提高可读性,例如初始化惰性字段成员,如:

    class Bean {
      private List<Bean> beans = Collection.emptyList();
      public List<Bean> getBeans() {
        if (beans == Collections.EMPTY_LIST) { beans = new ArrayList<>(); }
        return beans;
      }
    }
    
    1. 使用新工厂作为方法参数构建器
    2. 在使用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));
      

      你(不同意)吗?

1 个答案:

答案 0 :(得分:7)

(IM)可变性

首先,重要的是要注意集合工厂返回不可变的变体。不幸的是,这不会在类型系统中显示,因此您必须手动/精神跟踪。这已经禁止了一些可能值得的替换,因此它必须在您的规则列表中变为 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