当代码中包含 Javainstanceof
操作符时,很多人都会皱起眉头并说这是禁忌。例如:
请注意,如果您必须经常使用该运算符,通常表明您的设计存在一些缺陷。因此,在设计良好的应用程序中,您应该尽可能少地使用该运算符(当然,该一般规则也有例外)。
不过,没有进一步详细说明什么时候可以使用instanceof
,什么时候不行。
我对此进行了一些思考,并阐明了以下指导方针。我认为这可能在互联网上的某个地方讨论过,但我找不到。因此这个问题并征求您的评论:
instanceof
在接口上使用是可以的;instanceof
在实现上使用是不行的
这是“好的”案例的示例。
示例:动物目录,其中一些(但不是全部)可以飞
Animal.java
public interface Animal {
String getName();
String makeNoise();
}
CanFly.java
public interface CanFly {
float getMaxInAirDistanceKm();
}
Cat.java
public class Cat implements Animal {
@Override
public String getName() {
return "Cat";
}
@Override
public String makeNoise() {
return "meow";
}
}
BaldEgale.java
public class BaldEagle implements Animal, CanFly {
@Override
public String getName() {
return "BaldEagle";
}
@Override
public String makeNoise() {
return "whistle";
}
@Override
public float getMaxInAirDistanceKm() {
return 50;
}
}
Catalog.java
import java.util.ArrayList;
import java.util.List;
public class Catalog {
private List<Animal> animals = new ArrayList<>();
public void putAnimal(Animal animal) {
animals.add(animal);
}
public void showList() {
animals.forEach(animal -> {
StringBuilder sb = new StringBuilder();
sb.append(animal.getName() + ": ");
sb.append(animal.makeNoise() + " ");
// this block exemplifies some processing that is
// specific to CanFly animals
if (animal instanceof CanFly) {
sb.append(String.format(" (can stay in air for %s km)",
((CanFly) animal).getMaxInAirDistanceKm()));
}
System.out.println(sb.toString());
});
}
鸿蒙传说
子衿沉夜
白衣染霜花
相关分类