我有一个域对象 Invoice
,它有大约 60 个属性,有些是必需的,有些是可选的。这个 Invoice
类是底层数据库表中记录的表示,其中某些列值用应用程序层类包装(例如 Enum 表示存储在 DB 中的简单整数,Currency 表示 double 等) .
这个 Invoice
类目前定义如下:
- 公共(public)全参数构造函数。
- 公共(public) setter/getter 。
- protected 二传手。
现在,创建 Invoice
对象的此类客户将所有 60 个奇数属性传递给构造函数,这让此类客户感到害怕。出于显而易见的原因,我坚决反对将 setter 公开。
您能否建议一种允许创建/修改此发票对象的更好方法?如果您需要更多详细信息,请告诉我。
最佳答案
使用 builder 模式
使用 Builder Pattern Joshua Bloch 在他的书中描述了 Effective Java 2nd Edition .您可以在 http://www.javaspecialists.eu/archive/Issue163.html 中找到相同的示例
特别注意这一行:
NutritionFacts locoCola = new NutritionFacts.Builder(240, 8) // Mandatory
.sodium(30) // Optional
.carbohydrate(28) // Optional
.build();
使用 BeansUtils.populate
其他方法是使用方法org.apache.commons.beanutils.BeanUtils.populate(Object, Map)
来自 Apache Commons BeansUtils .在这种情况下,您需要一个映射来存储对象的属性。
代码:
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>
]
关于java - 创建具有大量属性的对象的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12453398/