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 。 因为 枚举的应用场景 组织常量 (编辑:4S站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |