3 回答
TA贡献1820条经验 获得超10个赞
您可以将可能的状态表示为枚举类型:
enum SausageType {
FreshPackaged,
FreshUnpackaged,
NotFresh;
}
然后更改您的构造函数以使用 aSausageType而不是 two Booleans。
这种方法的优点是不可能用错误的状态组合调用构造函数,对于你的类的用户来说很明显可能的值是什么,你不需要记住保持参数的脆弱的运行时检查与不断变化的要求保持同步。
TA贡献1820条经验 获得超2个赞
您当前的方法几乎没有问题:
有一种方法可以创建
new
没有意义的写入对象,例如new Sausage(..., false, true)
packaged 将被静默转换为false
. 这很混乱,使代码更难理解。您正在混合
Boolean
对象类型和boolean
原始类型,这将导致不必要的自动装箱。如果您不需要支持null
使用boolean
.boolean
字段可能不需要is
前缀。
由于有两个布尔标志和 4 种可能性,它们可以被设置(true true
, true false
, false true
, false false
)但只有 3 个有效选项可能命名为工厂方法会更合适:
public class Sausage {
public static Sasuage newFreshPackaged(Meat meat) {
return new Sasuage(meat, true, true);
}
public static Sasuage newFreshNotPackaged(Meat meat) {
return new Sasuage(meat, true, false);
}
public static Sasuage newNotFreshNotPackaged(Meat meat) {
return new Sasuage(meat, false, false);
}
private Sausage(Meat meat, boolean fresh, boolean packaged) {
this.meat = meat;
this.fresh = fresh;
this.packaged = packaged;
}
}
TA贡献1845条经验 获得超8个赞
悄悄改成isPackaged可能false是调用代码的惊喜。在这里,如果选择了组合(非新鲜、包装),您可以选择抛出异常。
if (!isFresh && isPackaged) {
throw new IllegalArgumentException("Can't be both not fresh and packaged!");
}
this.isFresh = isFresh;
this.isPackaged = isPackaged;
您还可以决定使用private强制执行您的要求的工厂方法(制作您的构造函数)。这将避免需要抛出异常。
public static Sausage createFreshSausage(Meat meat, boolean isPackaged) {
return new Sausage(meat, true, isPackaged);
}
public static Sausage createNotFreshSausage(Meat meat) {
return new Sausage(meat, false, false);
}
顺便说一句,通常原语boolean将用于构造函数的参数类型,而不是 object wrapper Boolean,就像您的实例变量一样。null此处允许的值没有Boolean任何意义。
添加回答
举报