[英]Better way to create an object with lot of attributes
我有一個域對象Invoice
,它有大約60個屬性,一些是必需的,一些是可選的。 此Invoice
類表示基礎DB表中的記錄,其中某些列值包含應用程序層類(如存儲在DB中的簡單整數的Enum,雙精度的貨幣等)。
此Invoice
類目前定義如下:
現在,它正在嚇唬創建Invoice
對象的這個類的客戶端,將所有60個奇數屬性傳遞給構造函數。 由於顯而易見的原因,我堅決反對公開場所 。
您能否建議一種更好的方法來允許創建/修改此發票對象? 如果您需要更多詳細信息,請與我們聯系。
使用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.