【发布时间】:2021-07-12 03:57:57
【问题描述】:
我正在尝试为动物园建模。
假设我在动物园的区域有以下结构(省略了一些细节)
public abstract class AnimalHabitat{
private ArrayList<Animal> animals = new ArrayList<>();
public void setAnimal(Animal animal) {
animals.add(animal)
}
}
public class Enclosure extends AnimalHabitat{}
public class Aquarium extends AnimalHabitat{}
public class Cage extends AnimalHabitat{}
那么我有以下动物结构
public abstract class Animal{}
public class Lion extends Animal{}
public class Zebra extends Animal{}
public class Shark extends Animal{}
public class Starfish extends Animal{}
public class Parrot extends Animal{}
public class Eagle extends Animal{}
我想将动物添加到其相应的适当栖息地。为了简化代码,我想使用标记接口,例如
public interface TerrestrialAnimal{}
public class Lion extends Animal implements TerrestrialAnimal{}
public class Zebra extends Animal implements TerrestrialAnimal{}
然后我就可以了
public class Zoo{
public boolean addAnimal(AnimalHabitat habitat, Animal animal) {
if (animal instanceOf TerrestrialAnimal && habitat instanceOf Enclosure) {
habitat.set(animal);
return true;
}
if (animal instanceOf AquaticAnimal && habitat instance of Aquarium) {
habitat.set(animal);
return true;
}
// So for aerial
}
}
然而另一种方法是使用枚举。例如假设我有
public enum AnimalType{
Terrestrial, Aquatic, Aerial;
//getter
}
然后在我可以定义的Animal抽象类中
public abstract class Animal{
private AnimalType type;
// Initialise in the constructor depending on the animal instance
}
我会在 Zoo 的 addAnimal() 方法中做同样的事情。
每种方法的优缺点是什么?谢谢!
【问题讨论】:
-
在事物数量有限的情况下使用枚举。动物和栖息地(实际上)有无限多的东西,所以不能用枚举很好地建模。