[英]How to avoid redundant code for static methods
假设我有以下课程:
public class Cat {
private final String noise = "meow";
pulic static void makeNoise(){
System.out.println(noise);
}
}
public class Dog {
private final String noise = "woof";
pulic static void makeNoise(){
System.out.println(noise);
}
}
如您所见,这两个类共享几乎相同的代码。 要删除冗余代码,我将创建一个父类,如下所示:
public abstract class Animal {
protected final String noise;
public Animal(String noise) {
this.noise = noise;
}
public void makeNoise() {
System.out.println(noise);
}
}
public class Dog extends Animal{
public Dog(){
super("woof");
}
}
现在很不幸,我遇到了两个问题:
可能的解决方案是这样的事情:public abstract void makeNoise(); 这是不允许的,也不会消除将代码复制到Animal的每个子代中的需要。
在保持makeNoise方法静态的同时,您将如何消除在动物的子代中拥有冗余代码的需求?
Java中的静态方法不能在子类中覆盖。
如果您在子类中定义了与父类中的静态方法具有相同签名的静态方法,则该方法不会覆盖父方法,而会将其隐藏。 父类和子类中的方法彼此无关。
在您的示例中,如果Animal
存在方法static void makeNoise()
,并且任何子类也都定义了该方法,则该子类只是在Animal中隐藏了makeNoise
方法。
在您的示例中,静态方法可以做的最好的事情是:
public static void makeNoise(String noise) {
System.out.println(noise);
}
并以这种方式调用方法:
Animal.makeNoise(Cat.NOISE); // A constant NOISE is defined in each subclass
如果方法makeNoise
是非静态的,则可以在每个子类中使用继承来使用不同的噪声:
public abstract class Animal {
protected String noise;
protected Animal(String noise) {
this.noise = noise;
}
public void makeNoise() {
System.out.println(noise);
}
}
public class Cat extends Animal{
public static final String NOISE = "meow";
public Cat() {
super(NOISE);
}
}
为什么用静态方法表示现实世界中的对象行为? 每只动物都有自己的行为,因此您要区分它们。
enum AnimalBehavior {
MEOW, WOOF, ROAR
}
您可以使用包含每种动物行为的枚举。 还请考虑以下情况:狼在满月的夜晚保持how叫。 他一直这样做,直到筋疲力尽。 您想跟踪一个指示您的狼能量水平的条形图。
private int energy = 100;
public static void wolfHowl() {
System.out.println(AnimalBehavior.ROAR);
energy = energy - 10;
}
这在技术上是行不通的,因为您使用的是静态方法。.因此请记住如何设计自己的东西,因为那只狼实际上会how叫而不会累,直到有人真的生气了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.