我需要读取给定字段名称的字段值。假设我有一个名为product的类,它有字段:大小、图像、链接..并且有 getSize()、getImage() 和 getLink() 等方法来读取这些值。现在,如果我给出“大小”,我想通过调用 getSize() 来获取大小,给定“图像”,通过调用 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;
....
问题是我这个类中有太多字段,整个代码看起来很丑。我也尽量避免使用反射页面,因为可读性很差。还有其他想法可以很好地处理这个问题吗?谢谢
最佳答案
除了反射或显式切换(如您所拥有的)之外,唯一真正的选择是根本不具有这些字段。您可以只使用通用的 getAttribute(Attribute a)
,而不是 getSize()
、getImage()
等。 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()
相同(假设枚举值和方法是“当然,t 已定义)。
关于java - java中通过名称获取字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24437312/