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

标签 java oop design-patterns

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

相关文章:

java - hibernate : Delete child entry using hql

java - 计算一个位置中每种类型的件数的优雅方法

c++ - 什么时候让一个对象删除自己?

java - 访问者模式可以包含一些状态吗?

c# - 代码改进 : Better alternatives to this pattern?

java - 使用 gcm 更新 ListView 中的 ImageView

java - SQL 的未分类 SQLException

oop - 在 ABAP OO 中使用包含常量的包含

oop - 使用过程式代码重用 Java 类?

.net - 使用 MVVM 处理 WPF 中的对话框