假设我有一个班级宠物,它由两个变量组成:
Class Pet {
Category category; // be amphibian, fish, mammal, dog
Diet diet; //meat, vegetarian, omnivore
...
如果category = dog我想限制饮食到杂食动物(反之亦然)。我的实际问题有点复杂,最好的编码方法是什么?我从嵌套枚举开始,然后是内部构建器类......
这是我可以采用的常见模式吗?
答案 0 :(得分:2)
如果尝试使用无效的参数组合创建类的实例,则可以让构造函数抛出异常。
这假设这些属性是不可变的(因为它们看起来来自上下文)。如果不是,diet
等的设置者也需要强制执行约束。
答案 1 :(得分:2)
你有这个麻烦,因为你没有在这里利用继承。 Dog
是一个 Pet
。所以让Dog extend Pet
。 Pet
将使用抽象setDiet()
,Dog
将通过应用适用于狗的饮食规则来实现此目的。
class Pet
{
Diet diet;
abstract boolean satisfiesDietRules();
public Pet()
{
if(!satisfiesDietRules())
{
throw CannotCreatePetException();
}
}
}
class Dog extends Pet
{
boolean satisfiesDietRules()
{
//rules
}
}
现在,您可以将饮食规则封装在各自的enum
(您当前的方法)中,或利用自然的继承。如果你去组合方法,那么你就无法利用多态性。因此,要了解您要使用哪一个,这取决于您的业务需求。如果你确定你没有违反LSV,那么继承似乎是一个自然的解决方案。