运行时注释设计和性能

时间:2015-04-14 07:55:55

标签: java annotations

我有一个java api,它执行外部资源查找,然后将值映射到Pojo。为此,api需要将Pojo的字段名称作为字符串值,例如:

public <F> F populatePojoFields(String primaryField, String secondaryField);

这很好用,但是将pojo字段名称作为String传递给api感觉不对。我能够通过为pojo编写标记注释来改变这一点,所以现在它就像

public class POJO {
   @Primary //custom marker annotation
   private int mojo;

   @Secondary //custom marker annotation
   private String jojo;
}

String primaryField = getFieldNameUsingReflection(Pojo.class, Primary.class)
String secondryField = getFieldNameUsingReflection(Pojo.class, Secondary.class)

Pojo pojo = populatePojoFields(primaryField, secondaryField);

这样我就不必跟踪字符串值,我只需要在Pojo字段中添加标记注释即可。这很好,但我担心性能。这是一种标准的做事方式吗?因为每次我们需要调用api时,保持硬编码字符串值比查找字段名称更有效。有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

如果经常调用getFieldNameUsingReflection,您可以考虑缓存此调用的结果。 您可以使用带有内部Map的单例类,其代码如下所示:

public class SingletonMapPrimarySecondary {
    Map<Class, String> mapPrimary;
    Map<Class, String> mapSecondary;

    // TODO: Handle mapPrimary and mapSecondary creation and singleton pattern

    public String getPrimary(Class clazz) {
        String primary = mapPrimary.get(clazz);
        if (primary == null) {
            primary = getFieldNameUsingReflection(clazz, Primary.class);
            mapPrimary.put(clazz, primary);
        }
        return primary;
    }

    public String getSecondary(Class clazz) {
        // TODO: Similar to getPrimary
    }
}