施工人员应该如何暴露?

时间:2015-04-03 11:37:54

标签: java builder

假设我有一个构建器类,它构建一个属于其他包的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()。

对于我的情况(实用程序包),哪种暴露构建器的方法更好?

1 个答案:

答案 0 :(得分:1)

我认为将构建器置于Item类本身内是一个糟糕的设计决策,无论可能的复杂逻辑如何。

这绝对违反了SRP(单一责任原则)。如果我们遵循这样的方法,那么我们将把与Item类间接相关的所有东西都放到类本身,强烈地限制任何进一步的可扩展性。