在这个假设的问题中,我创建了一个类来表示香肠,它可以是: A.新鲜和包装的B.新鲜的和未包装的C.不新鲜和未包装的
注意:它不能不是新鲜的和包装的。
考虑到这一点,我正在寻找创建构造器的最佳实践。
我尝试的方法如下,但我认为应该有更好的解决方案。
public class Sausage {
Meat meat;
boolean isFresh;
boolean isPackaged;
public Sausage(Meat meat, Boolean isFresh, Boolean isPackaged) {
this.meat = meat;
if (!isFresh) {
this.isFresh = false;
this.isPackaged = false;
}
else if (isPackaged) {
this.isFresh = true;
this.isPackaged = true;
}
else {
this.isFresh = true;
this.isPackaged = false;
}
}
}
我正在寻找一种更干净的方式来提供这种功能。
发布于 2019-05-29 07:07:33
可以将可能的状态表示为枚举类型:
enum SausageType {
FreshPackaged,
FreshUnpackaged,
NotFresh;
}
然后更改您的构造函数以接受一个SausageType
而不是两个Boolean
。
这种方法的优点是不可能使用错误的状态组合来调用构造函数,您的类的用户可以清楚地看到可能的值是什么,并且您不需要记住保持对参数的脆弱运行时检查以适应不断变化的需求。
发布于 2019-05-29 07:05:32
默默地将isPackaged
更改为false
可能会让调用代码感到惊讶。在这里,如果选择了组合(not fresh,packaged),则可以选择抛出异常。
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
,而不是像实例变量那样在对象包装器Boolean
中使用。在这里,Boolean
允许的null
值没有任何意义。
https://stackoverflow.com/questions/56351028
复制相似问题