Java Enum

常量

在JDK1.5 之前,我们定义常量都是: public static final …. 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

public enum Color {
  RED, GREEN, YELLOW
}

switch

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

enum Signal {
    GREEN, YELLOW, RED
}

public class TrafficLight {
    Signal color = Signal.RED;

    public void change() {
        switch (color) {
        case RED:
            color = Signal.GREEN;
            break;
        case YELLOW:
            color = Signal.RED;
            break;
        case GREEN:
            color = Signal.YELLOW;
            break;
        }
    }
}

向枚举中添加新方法

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。

public enum Color {
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
    // 成员变量
    private String name;
    private int index;

    // 构造方法
    private Color(String name, int index) {
        this.name = name;
        this.index = index;
    }

    // 普通方法
    public static String getName(int index) {
        for (Color c : Color.values()) {
            if (c.getIndex() == index) {
                return c.name;
            }
        }
        return null;
    }

    // get set 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }
}

覆盖枚举的方法

下面给出一个toString()方法覆盖的例子。

public class Test {
    public enum Color {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
        // 成员变量
        private String name;
        private int index;

        // 构造方法
        private Color(String name, int index) {
            this.name = name;
            this.index = index;
        }

        // 覆盖方法
        @Override
        public String toString() {
            return this.index + "_" + this.name;
        }
    }

    public static void main(String[] args) {
        System.out.println(Color.RED.toString());
    }
}

实现接口

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

public interface Behaviour {
    void print();

    String getInfo();
}

public enum Color implements Behaviour {
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
    // 成员变量
    private String name;
    private int index;

    // 构造方法
    private Color(String name, int index) {
        this.name = name;
        this.index = index;
    }

    // 接口方法

    @Override
    public String getInfo() {
        return this.name;
    }

    // 接口方法
    @Override
    public void print() {
        System.out.println(this.index + ":" + this.name);
    }
}

使用接口组织枚举

public interface Food {
    enum Coffee implements Food {
        BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
    }

    enum Dessert implements Food {
        FRUIT, CAKE, GELATO
    }
}

关于枚举集合的使用

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档

方法介绍

所有枚举类都继承了Enum的方法,下面我们详细介绍这些方法。

ordinal()

返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。

Color.RED.ordinal();  //返回结果:0
Color.BLUE.ordinal();  //返回结果:1

compareTo()

Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)

Color.RED.compareTo(Color.BLUE);  //返回结果 -1

values()

静态方法,返回一个包含全部枚举值的数组。

Color[] colors=Color.values();
for(Color c:colors){
    System.out.print(c+","); 
}
//返回结果:RED,BLUE,BLACK YELLOW,GREEN,

toString()

返回枚举常量的名称。

Color c=Color.RED;
System.out.println(c);//返回结果: RED

valueOf()

这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。

Color.valueOf("BLUE");   //返回结果: Color.BLUE

equals()

比较两个枚举类对象的引用。

//JDK源代码:      
public final boolean equals(Object other) {  
    return this==other;  
}  

>
>
>
>
文章转载自 http://stormzhang.com/java/2013/12/31/java-enum/

Javaenum(枚举)是一种特殊的数据类型,用于定义一组固定的常量。可以把 enum 看成是一个普通的 class,能定义一些属性和方法,但 enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 `java.lang.Enum`(Java 是单一继承) [^1]。 ### 使用方法 - **定义枚举类型**:创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 `java.lang.Enum` 类的子类(`java.lang.Enum` 是一个抽象类)。枚举类型符合通用模式 `Class Enum<E>`,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 `protected Enum(String name, int ordinal)` 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序 [^2]。 ```java enum Color { RED, BLUE, BLACK, YELLOW, GREEN } ``` - **访问枚举值**:可以直接通过枚举类型名访问其枚举值。 ```java Color red = Color.RED; ``` - **使用枚举方法**:所有枚举类都继承了 `Enum` 的方法,常用方法如下: - **`ordinal()` 方法**:返回枚举值在枚举类中的顺序,这个顺序根据枚举值声明的顺序而定。 ```java int redOrdinal = Color.RED.ordinal(); // 返回结果:0 ``` - **`compareTo()` 方法**:`Enum` 实现了 `java.lang.Comparable` 接口,因此可以比较对象与指定对象的顺序。`Enum` 中的 `compareTo` 返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出 `ClassCastException` 异常。 ```java int compareResult = Color.RED.compareTo(Color.BLUE); // 返回结果 -1 ``` - **`values()` 方法**:静态方法,返回一个包含全部枚举值的数组。 ```java Color[] colors = Color.values(); for (Color c : colors) { System.out.print(c + ","); } ``` - **`toString()` 方法**:返回枚举常量的名称。 ```java Color c = Color.RED; System.out.println(c); // 返回结果: RED ``` - **`valueOf()` 方法**:这个方法和 `toString` 方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。 ```java Color blue = Color.valueOf("BLUE"); // 返回结果: Color.BLUE ``` - **`equals()` 方法**:比较两个枚举类对象的引用。 ```java boolean isEqual = Color.RED.equals(Color.RED); ``` ### 特性 - **继承性**:所有枚举类都隐式继承自 `java.lang.Enum` 类,因此不能再继承其他类,但可以实现接口 [^1][^2][^4]。 - **常量性**:枚举值是常量,在定义后不能被修改。 - **类型安全性**:枚举类型提供了类型安全的常量集合,编译器可以检查类型错误。 - **可迭代性**:可以使用 `values()` 方法返回枚举值的数组,从而进行迭代操作。 ### 最佳实践 - **使用枚举表示状态**:可以使用枚举来表示对象的不同状态,例如订单状态、用户状态等。 ```java enum OrderStatus { CREATED, PROCESSING, SHIPPED, DELIVERED, CANCELLED } ``` - **在 `switch` 语句中使用枚举**:枚举在 `switch` 语句中使用非常方便,可以提高代码的可读性。 ```java OrderStatus status = OrderStatus.SHIPPED; switch (status) { case CREATED: System.out.println("订单已创建"); break; case PROCESSING: System.out.println("订单正在处理"); break; case SHIPPED: System.out.println("订单已发货"); break; case DELIVERED: System.out.println("订单已送达"); break; case CANCELLED: System.out.println("订单已取消"); break; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值