Java(enum)枚举用法详解
|
概念
在Java中,被
enum Color { RED,GREEN,BLUE }
如果枚举不添加任何方法,枚举值默认为从0开始的有序数值。以 Color 枚举类型举例,它的枚举常量依次为RED:0,GREEN:1,BLUE:2 枚举的好处:可以将常量组织起来,统一进行管理。 枚举的典型应用场景:错误码、状态机等。 枚举类型的本质 尽管 创建enum时,编译器会为你生成一个相关的类,这个类继承自
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>,Serializable { ... }
枚举的方法 在enum中,提供了一些基本方法:
可以使用 此外, 例:展示enum的基本方法
public class EnumMethodDemo {
enum Color {RED,BLUE;}
enum Size {BIG,MIDDLE,SMALL;}
public static void main(String args[]) {
System.out.println("=========== Print all Color ===========");
for (Color c : Color.values()) {
System.out.println(c + " ordinal: " + c.ordinal());
}
System.out.println("=========== Print all Size ===========");
for (Size s : Size.values()) {
System.out.println(s + " ordinal: " + s.ordinal());
}
Color green = Color.GREEN;
System.out.println("green name(): " + green.name());
System.out.println("green getDeclaringClass(): " + green.getDeclaringClass());
System.out.println("green hashCode(): " + green.hashCode());
System.out.println("green compareTo Color.GREEN: " + green.compareTo(Color.GREEN));
System.out.println("green equals Color.GREEN: " + green.equals(Color.GREEN));
System.out.println("green equals Size.MIDDLE: " + green.equals(Size.MIDDLE));
System.out.println("green equals 1: " + green.equals(1));
System.out.format("green == Color.BLUE: %bn",green == Color.BLUE);
}
}
输出 =========== Print all Color =========== RED ordinal: 0 GREEN ordinal: 1 BLUE ordinal: 2 =========== Print all Size =========== BIG ordinal: 0 MIDDLE ordinal: 1 SMALL ordinal: 2 green name(): GREEN green getDeclaringClass(): class org.zp.javase.enumeration.EnumDemo$Color green hashCode(): 460141958 green compareTo Color.GREEN: 0 green equals Color.GREEN: true green equals Size.MIDDLE: false green equals 1: false green == Color.BLUE: false 枚举的特性 枚举的特性,归结起来就是一句话: 除了不能继承,基本上可以将 但是这句话需要拆分去理解,让我们细细道来。 枚举可以添加方法 在概念章节提到了,枚举值默认为从0开始的有序数值 。那么问题来了:如何为枚举显示的赋值。 Java 不允许使用 如果你接触过C/C++,你肯定会很自然的想到赋值符号 例:C/C++ 语言中的枚举声明
typedef enum{
ONE = 1,TWO,THREE = 3,TEN = 10
} Number;
enum 可以添加普通方法、静态方法、抽象方法、构造方法 Java虽然不能直接为实例赋值,但是它有更优秀的解决方案:为 enum 添加方法来间接实现显示赋值。 创建 注意一个细节:如果要为enum定义方法,那么必须在enum的最后一个实例尾部添加一个分号。此外,在enum中,必须先定义实例,不能将字段或方法定义在实例前面。否则,编译器会报错。 例:全面展示如何在枚举中定义普通方法、静态方法、抽象方法、构造方法
public enum ErrorCode {
OK(0) {
public String getDescription() {
return "成功";
}
},ERROR_A(100) {
public String getDescription() {
return "错误A";
}
},ERROR_B(200) {
public String getDescription() {
return "错误B";
}
};
private int code;
// 构造方法:enum的构造方法只能被声明为private权限或不声明权限
private ErrorCode(int number) { // 构造方法
this.code = number;
}
public int getCode() { // 普通方法
return code;
} // 普通方法
public abstract String getDescription(); // 抽象方法
public static void main(String args[]) { // 静态方法
for (ErrorCode s : ErrorCode.values()) {
System.out.println("code: " + s.getCode() + ",description: " + s.getDescription());
}
}
}
注:上面的例子并不可取,仅仅是为了展示枚举支持定义各种方法。下面是一个简化的例子 例:一个错误码枚举类型的定义 本例和上例的执行结果完全相同。
public enum ErrorCodeEn {
OK(0,"成功"),ERROR_A(100,"错误A"),ERROR_B(200,"错误B");
ErrorCodeEn(int number,String description) {
this.code = number;
this.description = description;
}
private int code;
private String description;
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
public static void main(String args[]) { // 静态方法
for (ErrorCodeEn s : ErrorCodeEn.values()) {
System.out.println("code: " + s.getCode() + ",description: " + s.getDescription());
}
}
}
枚举可以实现接口
同样是实现上一节中的错误码枚举类,通过实现接口,可以约束它的方法。
public interface INumberEnum {
int getCode();
String getDescription();
}
public enum ErrorCodeEn2 implements INumberEnum {
OK(0,"错误B");
ErrorCodeEn2(int number,String description) {
this.code = number;
this.description = description;
}
private int code;
private String description;
@Override
public int getCode() {
return code;
}
@Override
public String getDescription() {
return description;
}
}
枚举不可以继承 enum 不可以继承另外一个类,当然,也不能继承另一个 enum 。 因为 枚举的应用场景 组织常量 (编辑:哈尔滨站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
