在 Java 中按名称获取字段值



我需要读取给定字段名称的字段值。 假设我有一个名为 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

因此,如果添加了新属性,则不必修改结构或枚举。

请注意,"尺寸">

和"尺寸"的行为会有所不同。

相关内容

  • 没有找到相关文章

最新更新