假设我有一个构建器类,它构建一个属于其他包的Item对象。
package mypackage;
import otherpackage.Item;
public class ItemBuilder {
private Material material;
private boolean unbreakable;
public ItemBuilder setMaterial(Material material) {
this.material = material;
return this;
}
public ItemBuilder setUnbreakable(boolean unbreakable) {
this.unbreakable = unbreakable;
return this;
}
public Item build() {
Item item = new Item();
item.material = material;
item.unbreakable = unbreakable; // Just example, the actual process is much complex than this one
return item;
}
}
我还有另一个实用程序类Items,它是这样的:
package mypackage;
import otherpackage.Item;
public final class Items {
private Items() {
}
public static boolean checkOwner(Item item, String owner) { // Again, just example
return item.owner.equals(owner);
}
}
我的包是另一个包的实用程序包。因此,我希望尽可能简化开发人员可以访问的实用程序(例如ItemBuilder)。
现在我有两种方式来公开这个类,一个是让开发人员实例化它。
new ItemBuilder().setMaterial(...).setUnbreakable(...).build();
与StringBuilder相同。
另一个是使ItemBuilder构造函数包本地,并将Items类编辑为:
package mypackage;
import otherpackage.Item;
public final class Items {
private Items() {
}
public static boolean checkOwner(Item item, String owner) { // Again, just example
return item.owner.equals(owner);
}
public static ItemBuilder builder() {
return new ItemBuilder();
}
}
这是Guava中常用的,例如ImmutableSet.builder()。
对于我的情况(实用程序包),哪种暴露构建器的方法更好?
答案 0 :(得分:1)
我认为将构建器置于Item
类本身内是一个糟糕的设计决策,无论可能的复杂逻辑如何。
这绝对违反了SRP(单一责任原则)。如果我们遵循这样的方法,那么我们将把与Item类间接相关的所有东西都放到类本身,强烈地限制任何进一步的可扩展性。