0

属性別にグループ化された統計を計算しています。この属性 ( Strings として指定) のカテゴリごとに、集計したい値を取得します。

このためには、カテゴリから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();
            }
        });

「言葉遣いの少ない」解決策はありますか?オブジェクトをインスタンス化するためだけに匿名クラスをスローする必要がないものはありますか?

4

3 に答える 3

4

元のコードは、Guavaチームが作成してほしいコードとまったく同じです。

私たちは反射を避ける傾向があります(当然のことながら、を除くcom.google.common.reflect)。これは壊れやすく、コンパイル時のチェックの利点を失う傾向があります。特定のクラスパブリックの引数なしコンストラクターがなく、を使用clazz.newInstance()した場合、実行時までそれを見つけることはできません。直接実装を作成すると、1〜2行かかる場合がありますが、それだけのメリットがあると考えています。

于 2012-10-27T00:17:14.037 に答える
0

これは、ユーザーコードの冗長性を減らすという私の考えですCreator<T>。つまり、それが言うことを実行するクラスです。

LoadingCache<String, SummaryStatistics> groupedStats =
    CacheBuilder.newBuilder().build(
        CacheLoader.from(Creators.of(SummaryStatistics.class)));

そのような獣が存在するのだろうかと思っていました。を実装しているクラスでは見つかりませんでしたSupplier<T>。同じパッケージ内のすべてのクラスの可能な実装は次のとおりです。

import com.google.common.base.Supplier;

public class Creator<T> implements Supplier<T> {

    private Class<T> class1;

    Creator(Class<T> class1) {
        this.class1 = class1;
    }

    @Override
    public T get() {
        try {
            return class1.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(
                    "Cannot instantiate object of type "
                        + class1.getCanonicalName(),
                    e);
        }
    }

}

public class Creators {
    public static <T> Creator<T> of(Class<T> class1) {
        return new Creator<T>(class1);
    }
}

もちろん、これは引数付きのコンストラクターを使用するように一般化することができます。

于 2012-10-26T22:16:54.963 に答える
0

キャッシュに使用するクラスを作成する、あまり言葉の少ないソリューションが必要です。

誰かが API を設計しても、誰もが幸せになれるとは限りません。Guava キャッシュは非常に柔軟で適応性があります。また、行の追加のいくつかのコードは問題になりません。

于 2012-10-26T22:08:36.017 に答える