限制对象的实例以适合某些参数

时间:2012-01-30 15:25:55

标签: java design-patterns

假设我有一个班级宠物,它由两个变量组成:

Class Pet {
Category category; // be amphibian, fish, mammal, dog
Diet diet; //meat, vegetarian, omnivore
...

如果category = dog我想限制饮食到杂食动物(反之亦然)。我的实际问题有点复杂,最好的编码方法是什么?我从嵌套枚举开始,然后是内部构建器类......

这是我可以采用的常见模式吗?

2 个答案:

答案 0 :(得分:2)

如果尝试使用无效的参数组合创建类的实例,则可以让构造函数抛出异常。

这假设这些属性是不可变的(因为它们看起来来自上下文)。如果不是,diet等的设置者也需要强制执行约束。

答案 1 :(得分:2)

你有这个麻烦,因为你没有在这里利用继承。 Dog 是一个 Pet。所以让Dog extend PetPet将使用抽象setDiet()Dog通过应用适用于狗的饮食规则来实现此目的。

class Pet
{
  Diet diet;

  abstract boolean satisfiesDietRules();

  public Pet()
  {
    if(!satisfiesDietRules())
    {
      throw CannotCreatePetException();
    }
  }
}

class Dog extends Pet
{
  boolean satisfiesDietRules()
  {
    //rules
  }
}

现在,您可以将饮食规则封装在各自的enum(您当前的方法)中,或利用自然的继承。如果你去组合方法,那么你就无法利用多态性。因此,要了解您要使用哪一个,这取决于您的业务需求。如果你确定你没有违反LSV,那么继承似乎是一个自然的解决方案。