java中的枚举是否可以有抽象方法

背景

偶然在代码中看到枚举中定义了抽象方法,觉得很奇怪。以前从来没有想过还可以这么用,真是涨姿势。

例子

1
2
3
4
5
6
7
8
9
10
public enum Animal {
CAT {
public String makeNoise() { return "MEOW!"; }
},
DOG {
public String makeNoise() { return "WOOF!"; }
};

public abstract String makeNoise();
}

参考自:http://stackoverflow.com/questions/7413872/can-an-enum-have-abstract-methods

更好的用法是枚举类实现一个接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface Operator {
int apply (int a, int b);
}

public enum SimpleOperators implements Operator {
PLUS {
int apply(int a, int b) { return a + b; }
},
MINUS {
int apply(int a, int b) { return a - b; }
};
}

public enum ComplexOperators implements Operator {
// can't think of an example right now :-/
}

参考自:http://stackoverflow.com/questions/2709593/why-would-an-enum-implement-an-interface

思考

枚举类Animal相当于是一个父类, Animal里面的每个元素都是它的子类,父类定义的抽象方法子类当然可以实现,甚至覆盖父类的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public enum Animal {
CAT {
public String makeNoise() { return "MEOW!"; }
@Override
public void sayHi(){
System.out.println("Cat say HI ");
}
},
DOG {
public String makeNoise() { return "WOOF!"; }

@Override
public void sayHi(){
System.out.println("Dog say HI ");
}
};

public abstract String makeNoise();

public void sayHi(){
System.out.println("Animal say hi");
}

public static void main(String[] args) {
Animal.CAT.sayHi();
Animal.DOG.sayHi();
}
}
文章目录
  1. 1. 背景
  2. 2. 例子
  3. 3. 思考
|