我有很多对象使用很少的类(意味着像 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();
    }
}

最佳答案

这将是缓存的教科书式实现。如果没有很多 ElementClass 并且你的程序是单线程的,这就足够了。
我认为不需要在 ElementClass 中保留小写名称。将其用作 map 键就足够了。我还假设您的项目中的 ElementClass 有更多内容,因为现在它只包含一个名称。
更新
澄清后很明显你确实只打算使用 String name 。在这种情况下,让每个 Element 只包含它的小写名称会更好,但实习:

public Element(String name) {
  this.name = name.toLowerCase().intern();
}
然后您可以比较 element.name == "special" 并保证匹配任何等于“special”的名称。

关于java - 运行时填充类枚举类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12132767/

10-13 03:29