2015-04-03 39 views
0

比方说,我有一个构建器类,它是构建一个属于其他包的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; 
    } 

} 

我也有另外一个实用工具类,物品,这是这样的:

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构造包本地,并编辑项目类:

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(); 
    } 

} 

这是常见的番石榴使用,如ImmutableSet.builder()。

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

+0

创建一个工厂,解析DI容器中的构建器。 – sturcotte06 2015-04-03 11:44:15

回答

1

我认为,将构建器放入Item类本身是一个糟糕的设计决定,不管可能的复杂逻辑如何。

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

+0

如果构建器放在与Item相同的包中,但不包含Item类的内部类? – TigerHix 2015-04-03 12:49:46

+1

这将是很好的解决方案。 Item不负责创建实例的具体算法,您仍然可以获得灵活性。 – Crazyjavahacking 2015-04-03 12:54:26