如何确保集合仅包含接口的每个实现之一
How to make sure a collection only contains one of each of the implementations of an interface
我有一个接口 MyInterface
,其中有许多实现和一个集合 Collection<MyInterface>
。
现在我如何确保有没有两个此集合中的元素 属于同一类型?
并且如何我可以防止来自的任何条目被覆盖?
这意味着在任何给定的时间点,集合中的每个实现只有 1 个实例。
出于显而易见的原因,我无法向界面添加默认的 equals(Object obj)
实现。
我也不能以任何方式保证每个实现都会覆盖 equals(Object obj)
方法(很明显,但为了彻底起见在这里)。
我目前看到的唯一方法是创建摘要Class MyAbstractClass
。但这似乎有些矫枉过正(?)
您可以使用 Map<Class<?>,MyInterface>
而不是 Collection<MyInterface>
。关键是实施 Class
。这将确保最多可以将每种类型的一个实例添加到 Map
.
以下是初始化地图并向其添加条目而不覆盖现有条目的方法:
Map<Class<?>,MyInterface> map = new HashMap<>();
...
if (!map.containsKey(obj.getClass())) {
map.put(obj.getClass(),obj);
}
此外,如果您愿意,请参阅 Collections.newSetFromMap 以了解如何实现由地图支持的集合。请注意,在运行时,您的地图可能会填充各种 类 作为键。您可以使用 Map<Class<? extends MyInterface>, MyInterface>
至少获得编译时保护。
我有一个接口 MyInterface
,其中有许多实现和一个集合 Collection<MyInterface>
。
现在我如何确保有没有两个此集合中的元素 属于同一类型?
并且如何我可以防止来自的任何条目被覆盖?
这意味着在任何给定的时间点,集合中的每个实现只有 1 个实例。
出于显而易见的原因,我无法向界面添加默认的 equals(Object obj)
实现。
我也不能以任何方式保证每个实现都会覆盖 equals(Object obj)
方法(很明显,但为了彻底起见在这里)。
我目前看到的唯一方法是创建摘要Class MyAbstractClass
。但这似乎有些矫枉过正(?)
您可以使用 Map<Class<?>,MyInterface>
而不是 Collection<MyInterface>
。关键是实施 Class
。这将确保最多可以将每种类型的一个实例添加到 Map
.
以下是初始化地图并向其添加条目而不覆盖现有条目的方法:
Map<Class<?>,MyInterface> map = new HashMap<>();
...
if (!map.containsKey(obj.getClass())) {
map.put(obj.getClass(),obj);
}
此外,如果您愿意,请参阅 Collections.newSetFromMap 以了解如何实现由地图支持的集合。请注意,在运行时,您的地图可能会填充各种 类 作为键。您可以使用 Map<Class<? extends MyInterface>, MyInterface>
至少获得编译时保护。