我正在计算按属性分组的统计信息。对于此属性的每个类别(给定为String
),我得到要汇总的值。
为此,我需要一个从类别到DescriptiveStatistics
(由org.apache.commons.math.stat.descriptive
提供)的映射。在这张图中,我必须检查对于给定的类别,是否已经创建了相应的DescriptiveStatistics
。此检查以及新DescriptiveStatistics
的创建应由地图完成。
我测试了Apache的LazyMap
,但由于非通用性,导致我使用了Guava的LoadingCache
。这些方针对我有用:
LoadingCache<String, DescriptiveStatistics> groupedStats =
CacheBuilder.newBuilder()
.build(new CacheLoader<String, DescriptiveStatistics>() {
@Override
public DescriptiveStatistics load(String key) {
return new DescriptiveStatistics();
}
});
有没有那么“罗word”的解决方案?不需要我仅仅为了实例化对象而抛出一个匿名类的类吗?
最佳答案
您的原始代码正是Guava团队希望您编写的代码。
我们倾向于避免反射(com.google.common.reflect
中自然除外)。它往往很脆弱,并且失去了编译时检查的好处-如果特定类没有公共的无参数构造函数,而您使用的是clazz.newInstance()
,则直到运行时才发现。编写直接实现可能会花费您一两行,但是我们认为值得这样做。