gpt4 book ai didi

java - 创建具有大量属性的对象的更好方法

转载 作者:搜寻专家 更新时间:2023-11-01 01:03:12 25 4
gpt4 key购买 nike

我有一个域对象 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com