我需要在给定字段名称的情况下读取字段值。假设我有一个名为product的类,它有字段:size,image,link ..并且有getSize(),getImage()和getLink()等方法来读取这些值。现在如果我给出' size',我希望通过调用getSize()获得大小,给定' image',通过调用getImage()来获取图像......
现在我有一个笨拙的代码调用getField(String fieldName)来处理这个:
public void String getField(String fieldName, Product p) {
String value = "";
swtich(fieldName):
case 'size':
value = p.getSize();
break;
case 'image':
value = p.getImage();
break;
....
问题是这个类中有太多字段,整个代码看起来很难看。我也试图避免反射页面,因为可读性差。还有其他想法可以很好地处理这个问题吗?感谢
答案 0 :(得分:1)
除了反射或显式切换(如你所知)之外,唯一真正的替代方案是根本没有那些字段。您可以只使用通用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()
相同(假设当前没有定义枚举值和方法)。
答案 1 :(得分:0)
您可以考虑直接使用属性名称作为地图和值的键作为属性。
HashMap<String, Object> attributes
因此,如果添加新属性,您不必修改结构或枚举。
小心,&#34;尺寸&#34;和&#34;尺寸&#34;将表现得不同。