我需要读取给定字段名称的字段值。 假设我有一个名为 product 的类,它有字段:size、image、link.. 并有 getSize((、getImage(( 和 getLink(( 等方法来读取这些值。 现在,如果我给出"size",我想通过调用getSize((来获取大小,给定"image",通过调用getImage((来获取图像...
现在我有一个笨拙的代码调用getField(字符串字段名称(来处理这个:
public void String getField(String fieldName, Product p) {
String value = "";
swtich(fieldName):
case 'size':
value = p.getSize();
break;
case 'image':
value = p.getImage();
break;
....
问题是我在此类中有太多字段,整个代码看起来很丑陋。 此外,由于可读性差,我尽量避免使用反射页面。 还有其他想法可以很好地处理这个问题吗?谢谢
除了反射或显式切换(如您所做的那样(,唯一真正的选择是根本不使用这些字段。而不是getSize()
、getImage()
等,你可以有一个通用的getAttribute(Attribute a)
。 Attribute
可能会有enum
.像这样:
enum Attribute { SIZE, IMAGE, ... }
public class Product {
Map<Attribute, String> attributes = new EnumMap<>(Attribute.class);
public String getAttribute(Attribute attribute) {
return attributes.get(attribute);
}
public void setAttribute(Attribute attribute, String value) {
attributes.put(attribute, value);
}
...
}
EnumMap
非常高效,所以这段代码会很快——不像实际字段那么快,但在你的应用中可能不会明显变慢。
使Attribute
成为enum
(例如,不仅仅是具有String
属性键(的原因是它为您提供了与显式getter函数相同的类型安全性。例如,p.getAttribute(Attribute.NOT_A_REAL_ATTRIBUTE)
将产生编译时错误,与p.getNotARealAttribute()
相同(当然,假设枚举值和方法未定义(。
您可以考虑直接使用属性名称作为映射的键,将值用作属性。
HashMap<String, Object> attributes
因此,如果添加了新属性,则不必修改结构或枚举。
请注意,"尺寸">和"尺寸"的行为会有所不同。