我有25个字段的实体。它没有任何逻辑,只是存储值。 它是用抽象构建器构建的。我不想在构建之后改变这个实体。 我想让所有领域都是最终的,但我不想制作25-params构造函数。 在这种情况下我应该使用什么模式? 现在我考虑包本地setter,但它比最终字段中所有值设置的语法检查更糟糕。 我无法在2-3个对象中打包这个字段
答案 0 :(得分:10)
我看到三个主要选项:
只有构建器知道的私有类,以及只有getter的公共接口。构建器使用接口而不是类来提供引用。
有两个类,一个是可变的(有点是信使类),另一个是不可变的,它在构造函数中接受可变的类并抓取它的字段。
让类具有所有字段的合理默认值,然后让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();