Collections.singleton() 返回 Set 而不是 Collection 有什么好处?变Java 9:Set.of & List.of

2022-09-01 20:34:12

Collections.singleton() 方法返回具有该单个参数的 ,而不是 .SetCollection

为什么会这样?从我所看到的,除了是的子类型之外,我看不到任何优势......这仅仅是因为无论如何都会扩展,所以没有理由不这样做吗?SetCollectionSetCollection

是的,还有Collections.singletonList(),但这是另一回事,因为您可以从一个...List.get()


答案 1

好处可以在JavaDoc文档中阅读的第一个形容词中找到:不可变

有时,当您使用的代码需要 Set(或 等)时。在你自己的上下文中,你可能只严格需要一个项目。若要实现自己的目标,即强制实施仅单项规则,同时需要在集合中呈现该项目,请使用禁止添加多个项目的实现。ListSet

Collections::singleton 上的“不可变”意味着,一旦创建,生成的对象保证只有一个项目。不是零,也不是超过一个。无法添加更多内容。无法删除一个项目。Set

例如,假设您的代码正在使用代表公司 CEO(CEO)的对象。你的代码只明确地处理CEO,所以你知道一次只能有一个这样的对象,总是一个CEO。但是,您希望利用一些现有代码来为指定的对象集合创建报表。通过使用,您可以保证自己的代码不会错误地拥有除单个员工之外的其他代码,同时仍然能够通过 .EmployeeEmployeeEmployeeCollection.singletonSet

Set< Employee > ceo = Collections.singleton( new Employee( "Tim Cook" ) ) ;  // Always exactly one item in this context, only one CEO is possible.

ceo.add( … ) ;     // Fails, as the collection is immutable.
ceo.clear() ;      // Fails, as the collection is immutable.
ceo.remove( … ) ;  // Fails, as the collection is immutable.

someReport.processEmployees( ceo ) ;

Java 9:Set.of & List.of

Java 9及更高版本提供了新的接口方法Set.ofList.of来获得相同的效果,即单个元素的不可变集合。

Set< Pet > pet = Set.of( someDog ) ;

重载同级方法以接受任意数量的元素位于不可变集合中,而不仅仅是一个元素。of

Set< Pet > pets = Set.of( someDog , someOtherDog , someCat ) ;

答案 2

我不确定本身是否有“好处”或“优势”?它只是返回单例的方法,并且当您想要单例时恰好是默认实现,因为单例恰好也是数学集。SetCollectionCollection