【发布时间】:2018-03-12 20:40:01
【问题描述】:
问题与以下课程有关。 Zookeeper1 和 Zookeeper2 是我可以使用的 2 个替代方案。我可以在 Zookeeper 中存储不同类型的动物。我应该能够获得这些课程。在第一种情况下,我将所有动物都存储在列表中(这意味着将来我可以轻松添加其他新动物),但是当我需要获取它时,我需要用 (Dog) 施放狗。在某个地方读到演员表是代码气味,所以我想看看是否有其他选择?其他解决方案会阻止投射,但每次添加新动物时都会出现添加新列表的问题。
class AnimalId{}
interface Animal{
AnimalId getAnimalId();
void breathe();
}
class Cat implements Animal{
public AnimalId getAnimalId() { return null; }
public void breathe() {}
}
class Dog implements Animal{
public AnimalId getAnimalId() { return null; }
public void breathe() {}
public void bark(){}
}
class ZooKeeper1{
Map<AnimalId, Animal> animals = new HashMap<>(); //future-proof
void addAnimal(Animal a){
animals.put(a.getAnimalId(), a);
}
void printAnimals(){
animals.forEach((key, value) -> System.out.println(key));
}
Dog getDog(AnimalId animalId){
return (Dog)animals.get(animalId); //NOK - must type-cast!
}
public static void main(String[] args) {
ZooKeeper1 zk1 = new ZooKeeper1();
zk1.addAnimal(new Cat());
zk1.addAnimal(new Dog());
zk1.printAnimals();
Dog d = zk1.getDog(new AnimalId());
d.bark();
}
}
class ZooKeeper2{
Map<AnimalId, Cat> cats = new HashMap<>();
Map<AnimalId, Dog> dogs = new HashMap<>(); //will need to add more lines in future
void addCat(Cat c){
cats.put(c.getAnimalId(), c);
}
void addDog(Dog d){
dogs.put(d.getAnimalId(), d); //will need to add more lines in future
}
void printAnimals(){
cats.forEach((key, value) -> System.out.println(key));
dogs.forEach((key, value) -> System.out.println(key)); //will need to add more lines in future
}
Dog getDog(AnimalId animalId){
return dogs.get(animalId); //OK no type-cast
}
public static void main(String[] args) {
ZooKeeper2 zk2 = new ZooKeeper2();
zk2.addCat(new Cat());
zk2.addDog(new Dog());
zk2.printAnimals();
Dog d = zk2.getDog(new AnimalId());
d.bark();
}
}
【问题讨论】:
-
这样的一般性问题很难回答。为什么你首先有
getDog方法 - 为什么你没有getCat方法?肯定不行的是return (Dog)animals.get(animalId);,因为您事先没有进行任何类型检查,这种方法只会在一半的时间里崩溃...... -
@luk2302 而不是 getCat,我会使用 getAnimal,因为它没有特定于 Cat 的方法。该代码只是为了使其易于阅读而模拟(我想会有额外的检查以确保它是一只狗)。
标签: java oop inheritance class-design