簡體   English   中英

創建具有大量屬性的對象的更好方法

[英]Better way to create an object with lot of attributes

我有一個域對象Invoice ,它有大約60個屬性,一些是必需的,一些是可選的。 Invoice類表示基礎DB表中的記錄,其中某些列值包含應用程序層類(如存儲在DB中的簡單整數的Enum,雙精度的貨幣等)。

Invoice類目前定義如下:

  • public full-arg構造函數。
  • 公眾獲得者。
  • 受保護的二傳手。

現在,它正在嚇唬創建Invoice對象的這個類的客戶端,將所有60個奇數屬性傳遞給構造函數。 由於顯而易見的原因,我堅決反對公開場所

您能否建議一種更好的方法來允許創建/修改此發票對象? 如果您需要更多詳細信息,請與我們聯系。

the Builder Pattern Builder模式

使用Joshua Bloch在他的“ Effective Java 2nd Edition”一書中描述的Builder Pattern 您可以在http://www.javaspecialists.eu/archive/Issue163.html中找到相同的示例

特別注意這條線:

NutritionFacts locoCola = new NutritionFacts.Builder(240, 8) // Mandatory
                          .sodium(30) // Optional
                          .carbohydrate(28) // Optional
                          .build();


BeansUtils.populate BeansUtils.populate

其他方法是使用Apache Commons BeansUtils中的方法org.apache.commons.beanutils.BeanUtils.populate(Object, Map) 在這種情況下,您需要一個映射來存儲對象的屬性。

代碼

public static void main(String[] args) throws Exception {

    Map<String, Object> map = new HashMap<>();
    map.put("servingSize", 10);
    map.put("servings", 2);
    map.put("calories", 1000);
    map.put("fat", 1);

    // Create the object
    NutritionFacts bean = new NutritionFacts();

    // Populate with the map properties
    BeanUtils.populate(bean, map);

    System.out.println(ToStringBuilder.reflectionToString(bean,
            ToStringStyle.MULTI_LINE_STYLE));

}

輸出

NutritionFacts@188d2ae[
  servingSize=10
  servings=2
  calories=1000
  fat=1
  sodium=<null>
  carbohydrate=<null>
]

你可以做的可能是你的對象分解成更小的對象。 根據上面的注釋,您可能需要用戶構建這些新對象,但是,根據您的數據庫設計,您可能只需要將主鍵或外鍵傳遞給該類。

然后,該類將具有一些將從數據庫中尋找相關數據的行為 這顯然會增加數據庫服務器的負載,但它會使您的類更簡單(盡管數量更多)。 復雜性的降低很可能會增加代碼重用性的可能性,並使其更易於維護。

正如@Jake King的建議,將60個屬性組合成更小的數據對象總是更好。

在這樣做時,我將研究一個方面,可能的組合是可選的,我將以這種方式組成。 例如,如果客戶端單擊使用當前地址和郵件地址,則郵件地址是可選的。

圍繞這些組合對象構建構造函數將幫助您輕松有效地管理/維護類。

如果您的Invoice對象有60個屬性,並且您確定不需要其中的一些屬性,則不需要為這些屬性創建getter和setter。始終建議您創建代碼中所需屬性的getter setter。 但是你需要確保省略的字段應該允許數據庫中的空約束。

否則,如果您需要代碼中的所有60個屬性,則根據客戶端的要求創建不同的構造函數。如果客戶端只需要傳遞4,那么創建構造函數接受4個參數,並且可以為數據庫中的值設置默認值通過客戶。

暫無
暫無

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

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