簡體   English   中英

通過在Java中的名稱獲取字段值

[英]get field value by its name in java

我需要讀取給定字段名稱的字段值。 說我有一個稱為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;
      .... 

問題是我在此類中有太多字段,整個代碼看起來很難看。 我也嘗試避免由於可讀性差的反射頁面。 還有其他想法可以很好地處理嗎? 謝謝

除了反射或顯式切換(如您所願)外,唯一真正的選擇是根本沒有這些字段。 可以使用通用的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()相同(假定未定義枚舉值和方法)。

您可以考慮將屬性名稱直接用作映射的鍵​​,將值用作屬性。

HashMap<String, Object> attributes

因此,如果添加了新屬性,則無需修改結構或枚舉。

注意,“大小”和“大小”的行為將有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM