【发布时间】:2012-06-09 08:38:51
【问题描述】:
我想在 Guava 中创建一个(不可变的)Multiset,它有一个条目 element,出现 occurrences,这两个条目在编译时都是未知的。
我想出的是这样的:
ImmutableMultiset.<X>builder().addCopies(element, occurrences).build()
我想我正在寻找这样的方法:
public static ImmutableMultiset<X> ImmutableMultiset.nOccurrencesOf(
X element, int occurrences){}
或:
public static ImmutableMultiset<X> Multisets.singletonMultiset(
X element, int occurrences){}
是否有任何我忽略的方法可以使上述代码更短?
【问题讨论】:
-
您的发现有什么问题?当一个简单的解决方案已经存在时,Guava 不会倾向于为每个可能的用例给出不同的签名。使用构建器似乎就是这种情况。
-
@JohnB ImmutableMultiset中有很多不同的重载方法,我觉得奇怪的是缺少这个
-
我认为既然他们把它放在了构建器中,他们认为没有必要直接把它放在类中。请注意,该类中唯一的
add方法只是为了满足接口并引发异常。 -
我遇到的主要问题是,在我的版本中,泛型类型信息丢失了,我必须参数化 builder() 调用。一种专门的方法可以改变这一点。
-
虽然会很好,但我没有看到 guava 团队做出这种改变。添加的方法的价值非常有限,因为它们会创建一个不可变的集合,其中不能添加任何其他元素。他们会提出这样一种情况,即您在一个集合中唯一想要的东西是 X 的 5 个实例的情况非常罕见。当前的构建器以通常需要的灵活性来实现这一点。通用规范是一个很小的代价。