如何使用许多字段构建语义不可变的实体

时间:2013-09-17 17:21:15

标签: java oop design-patterns

我有25个字段的实体。它没有任何逻辑,只是存储值。 它是用抽象构建器构建的。我不想在构建之后改变这个实体。 我想让所有领域都是最终的,但我不想制作25-params构造函数。 在这种情况下我应该使用什么模式? 现在我考虑包本地setter,但它比最终字段中所有值设置的语法检查更糟糕。 我无法在2-3个对象中打包这个字段

2 个答案:

答案 0 :(得分:10)

我看到三个主要选项:

  1. 只有构建器知道的私有类,以及只有getter的公共接口。构建器使用接口而不是类来提供引用。

  2. 有两个类,一个是可变的(有点是信使类),另一个是不可变的,它在构造函数中接受可变的类并抓取它的字段。

  3. 让类具有所有字段的合理默认值,然后让setter返回具有该字段集的类的 new 实例。这里的缺点是,要构建一个25字段的实例,最终会创建~24个一次性对象,具体取决于您需要更改多少合理的默认值。 ; - )

答案 1 :(得分:8)

Builder类作为static类中的Entity嵌套类。然后Builder类可以直接设置字段,您不需要在Entity中使用setter方法或 n -arg构造函数。

public class Entity
{
   // Just one attribute and getter here; could be 25.
   private int data;

   public int getData() { return data; }

   public static class Builder
   {
      // Just one attribute and getter here; could be 25.
      private int theData;

      public Entity build()
      {
         Entity entity = new Entity();

         // Set private field(s) here.
         entity.data = theData;

         return entity;
      }

      public Builder setData(int someData)
      {
         theData = someData;
         return this;
      }
   }
}

用法:

Entity entity = new Entity.Builder().setData(42).build();