我有一个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时,保持硬编码字符串值比查找字段名称更有效。有更好的方法吗?
答案 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
}
}