我正在计算按属性分组的统计信息。对于此属性的每个类别(给定为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(),则直到运行时才发现。编写直接实现可能会花费您一两行,但是我们认为值得这样做。

07-28 13:18