4

私はいくつかのクラスを使用する多くのオブジェクトを持っています(html + cssのような要素の視覚的な分類を意味します)。クラスはコンパイル時には不明であり、条件で何度も使用されます。

パフォーマンスを向上させるために、1つの解決策があります。

public class ElementClass {

    private static final Map<String, ElementClass> classes = new HashMap<>();

    public final String name;
    public final String lowerName;

    public ElementClass(String name, String lowerName) {
        this.name = name;
        this.lowerName = lowerName;
    }

    public static ElementClass get(String name) {
        String lower = name.toLowerCase();
        ElementClass c = classes.get(lower);
        if (c == null) {
            c = new ElementClass(name, lower);
            classes.put(lower, c);
        }
        return c;
    }
}

この方法は、変数getの比較よりも非常に少なく使用されます。ElementClassこれは、構成と一部のstatic変数の解析に使用されます。私はJavaの初心者なので、これが最善の方法かどうかはわかりません。

使用例ElementClass

// contains element styles based on it's class
Map<ElementClass,ElementStyle> styles;

void exampleFunction() {
    ElementClass c = ElementClass.get("special");
    for( Element e : elements ) {
        if( e.cls == c ) doSomethingSpecial();
    }
}
4

1 に答える 1

1

これは、キャッシュの教科書の実装になります。ElementClassが多くなく、プログラムがシングルスレッドの場合は、これで十分です。

小文字の名前を。内に保持する必要はないと思いますElementClass。マップキーとして使用するだけで十分です。ElementClassまた、名前が含まれているだけなので、プロジェクトにはさらに多くのものがあると思います。

アップデート

明確にした後、あなたが実際に使用することだけを意図していることが明らかになりましたString nameElementそのような場合、それぞれに小文字の名前だけを含めるほうがはるかに良いでしょうが、インターンされています:

public Element(String name) {
  this.name = name.toLowerCase().intern();
}

element.name == "special"次に、「特別」に等しい名前を比較して、一致することが保証されます。

于 2012-08-26T18:29:49.090 に答える