4

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

4

2 回答 2

9

我看到三个主要选项:

  1. 有一个只有构建器知道的私有类,以及一个只有 getter 的公共接口。构建器使用接口而不是类给出引用。

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

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

于 2013-09-17T17:25:09.817 回答
8

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

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();
于 2013-09-17T17:34:13.773 回答