如何避免静态方法的冗余代码
How to avoid redundant code for static methods
假设我有以下 classes:
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);
}
}
如您所见,这两个 classes 共享几乎相同的代码。要删除冗余代码,我会像这样创建一个 parent class:
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");
}
}
不幸的是,现在我 运行 遇到了两个问题:
- 因为动物的叫声不再是静态的,因为常量
将必须通过动物的构造函数进行分配,您将
需要创造一只猫或狗来获得该动物的声音。甚至
虽然它是一个常数。
- makeNoise() 方法需要在 class 动物中工作 -
默认情况下没有噪音。
一个可能的解决方案是这样的:
public 抽象无效 makeNoise();
这是不允许的,也不会消除将代码复制到 Animal.children 的每个人的需要。
如何在保持方法 makeNoise 静态的同时消除动物 children 中冗余代码的需要?
Java 中的静态方法不能在子class 中被覆盖。
如果您在子class 中定义静态方法,其签名与父class 中的静态方法相同,则该方法不会覆盖父方法,而是将其隐藏。父项和子项中的方法 class 彼此没有关系。
在您的示例中,如果 Animal
中存在方法 static void makeNoise()
并且任何子 class 也定义了该方法,子 class 只是隐藏了 makeNoise
Animal 中的方法。
在您的示例中,您可以使用静态方法做的最好的事情是:
public static void makeNoise(String noise) {
System.out.println(noise);
}
并以这种方式调用方法:
Animal.makeNoise(Cat.NOISE); // A constant NOISE is defined in each subclass
如果方法 makeNoise
是非静态的,则可以使用继承在每个子class:
中使用不同的噪音
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
}
您可以使用包含所有动物行为的枚举。
还要考虑以下情况:一只狼在月圆之夜不停地嚎叫。他一直这样做,直到他筋疲力尽。您想跟踪一个指示您的狼的能量水平的条。
private int energy = 100;
public static void wolfHowl() {
System.out.println(AnimalBehavior.ROAR);
energy = energy - 10;
}
这在技术上行不通,因为您使用的是静态方法。所以请记住您的设计方式,因为狼实际上可以嚎叫而不会感到疲倦,直到有人真的生气为止。
假设我有以下 classes:
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);
}
}
如您所见,这两个 classes 共享几乎相同的代码。要删除冗余代码,我会像这样创建一个 parent class:
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");
}
}
不幸的是,现在我 运行 遇到了两个问题:
- 因为动物的叫声不再是静态的,因为常量 将必须通过动物的构造函数进行分配,您将 需要创造一只猫或狗来获得该动物的声音。甚至 虽然它是一个常数。
- makeNoise() 方法需要在 class 动物中工作 - 默认情况下没有噪音。
一个可能的解决方案是这样的: public 抽象无效 makeNoise(); 这是不允许的,也不会消除将代码复制到 Animal.children 的每个人的需要。
如何在保持方法 makeNoise 静态的同时消除动物 children 中冗余代码的需要?
Java 中的静态方法不能在子class 中被覆盖。
如果您在子class 中定义静态方法,其签名与父class 中的静态方法相同,则该方法不会覆盖父方法,而是将其隐藏。父项和子项中的方法 class 彼此没有关系。
在您的示例中,如果 Animal
中存在方法 static void makeNoise()
并且任何子 class 也定义了该方法,子 class 只是隐藏了 makeNoise
Animal 中的方法。
在您的示例中,您可以使用静态方法做的最好的事情是:
public static void makeNoise(String noise) {
System.out.println(noise);
}
并以这种方式调用方法:
Animal.makeNoise(Cat.NOISE); // A constant NOISE is defined in each subclass
如果方法 makeNoise
是非静态的,则可以使用继承在每个子class:
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
}
您可以使用包含所有动物行为的枚举。 还要考虑以下情况:一只狼在月圆之夜不停地嚎叫。他一直这样做,直到他筋疲力尽。您想跟踪一个指示您的狼的能量水平的条。
private int energy = 100;
public static void wolfHowl() {
System.out.println(AnimalBehavior.ROAR);
energy = energy - 10;
}
这在技术上行不通,因为您使用的是静态方法。所以请记住您的设计方式,因为狼实际上可以嚎叫而不会感到疲倦,直到有人真的生气为止。