运行时填充类似枚举的类

时间:2012-08-26 18:26:11

标签: java

我有很多对象使用很少的类(意味着元素视觉分类,如html + css)。在编译时不知道类,它们在条件中多次使用。

为了提高性能,我有一个解决方案:

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();
    }
}

1 个答案:

答案 0 :(得分:1)

这将是缓存的教科书实现。如果没有很多ElementClasses,并且你的程序是单线程的,那就足够了。

我认为不需要在ElementClass内保留小写名称。将它用作地图键就足够了。我还假设项目中的ElementClass还有更多,因为它现在只包含一个名称。

更新

澄清之后很明显,你确实只打算使用String name。在这种情况下,最好让每个Element只包含其小写名称,但 interned

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

然后您可以比较element.name == "special"并保证匹配任何等于“特殊”的名称。