运行时注释设计和性能

Runtime annotations design and performance

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

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

这很好用,但是将 pojo 字段名称作为字符串传递给 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 时查找字段名称更有效。有更好的方法吗?

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

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
    }
}