运行时注释设计和性能
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
}
}
我有一个 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
}
}