目录
一. 简介
二. 声明 属性 方法
三. 常用方法
四. 使用技巧
五. 使用情景
六. 总结

一. 简介
在 Java 中,枚举类(Enum Class)是一种特殊的类,用于定义一组有限的、预定义的常量值。
枚举类的主要特点和优势包括:
类型安全:枚举类型提供了一种类型安全的方式来表示一组固定的值,避免了使用整数或字符串常量可能导致的错误。
可读性和可维护性:枚举值具有明确的名称,使得代码更具可读性和可理解性。当需要修改枚举值时,只需在枚举类中进行更改,而不必在整个代码中查找和替换常量。
相关方法:可以为枚举类定义方法,以提供与枚举值相关的特定功能。
以下是一个简单的枚举类示例:
public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
在上述示例中,定义了一个表示一周中每天的枚举类 Day 。
可以在枚举类中添加方法,例如:
public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
    public boolean isWeekday() {
        return this!= SATURDAY && this!= SUNDAY;
    }
}
在使用枚举类时,可以像这样进行操作:
Day today = Day.MONDAY;
if (today.isWeekday()) {
    System.out.println("It's a weekday");
}
总之,枚举类在 Java 中是一种非常有用的工具,用于处理有限的、固定的常量值集合,提高了代码的质量和可靠性。
二. 声明 属性 方法
在 Java 中,枚举类可以声明属性、方法和构造方法,以下是详细介绍:
声明属性
可以在枚举值中添加属性,为每个枚举值赋予特定的状态或数据。
public enum Season {
    SPRING("温和"), SUMMER("炎热"), AUTUMN("凉爽"), WINTER("寒冷");
    private String description;
    Season(String description) {
        this.description = description;
    }
    public String getDescription() {
        return description;
    }
}
方法
可以在枚举类中定义普通方法和抽象方法。
普通方法:
public enum Operation {
    ADD {
        @Override
        public int calculate(int num1, int num2) {
            return num1 + num2;
        }
    },
    SUBTRACT {
        @Override
        public int calculate(int num1, int num2) {
            return num1 - num2;
        }
    };
    public abstract int calculate(int num1, int num2);
}
构造方法
枚举类的构造方法只能是私有的,这样可以防止外部代码创建枚举值以外的实例。
public enum Color {
    RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255);
    private int r;
    private int g;
    private int b;
    Color(int r, int g, int b) {
        this.r = r;
        this.g = g;
        this.b = b;
    }
    public int getR() {
        return r;
    }
    public int getG() {
        return g;
    }
    public int getB() {
        return b;
    }
}
通过为枚举类添加属性、方法和构造方法,可以使枚举类更加灵活和强大,能够满足更复杂的业务需求。
三. 常用方法
在 Java 中,枚举类型提供了一些常用的方法,以下是一些常见的:
-  values()方法:返回枚举类型的所有值组成的数组。
   public enum Day {
       MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
   }
   public class EnumExample {
       public static void main(String[] args) {
           Day[] days = Day.values();
           for (Day day : days) {
               System.out.println(day);
           }
       }
   }
-  valueOf(String name)方法:根据给定的字符串名称返回对应的枚举值。如果输入的名称不存在对应的枚举值,会抛出IllegalArgumentException异常。示例: 
   Day day = Day.valueOf("MONDAY");
-  ordinal()方法:返回枚举值在枚举声明中的位置索引(从 0 开始)。
   int index = Day.MONDAY.ordinal(); 
这些方法在处理枚举类型时非常有用,可以方便地操作和获取枚举值的相关信息。
四. 使用技巧
以下是一些 Java 枚举类的使用技巧:
- 利用枚举类实现单例模式
 通过将枚举值作为单例对象,可以简单而有效地实现单例模式,并且线程安全。
enum Singleton {
    INSTANCE;
    // 单例的相关方法和属性
    public void doSomething() {
        // 具体操作
    }
}
- 结合接口增强枚举功能
 可以让枚举类实现一个接口,为枚举值提供统一的方法定义。
interface Behaviour {
    void perform();
}
enum Action implements Behaviour {
    RUN {
        @Override
        public void perform() {
            System.out.println("Running");
        }
    },
    JUMP {
        @Override
        public void perform() {
            System.out.println("Jumping");
        }
    };
}
- 在枚举中使用 switch语句
 根据不同的枚举值执行不同的逻辑。
enum Status {
    SUCCESS, FAILURE, PENDING;
    public void handle() {
        switch (this) {
            case SUCCESS:
                System.out.println("Operation succeeded");
                break;
            case FAILURE:
                System.out.println("Operation failed");
                break;
            case PENDING:
                System.out.println("Operation is pending");
                break;
        }
    }
}
- 为枚举值添加复杂的逻辑和数据
 可以在枚举值中包含更复杂的计算或数据处理逻辑。
enum Discount {
    FLAT_10(10) {
        @Override
        public double applyDiscount(double amount) {
            return amount - (amount * 0.1);
        }
    },
    FLAT_20(20) {
        @Override
        public double applyDiscount(double amount) {
            return amount - (amount * 0.2);
        }
    };
    private int percentage;
    Discount(int percentage) {
        this.percentage = percentage;
    }
    public abstract double applyDiscount(double amount);
}
- 枚举与注解结合
 可以使用枚举值作为注解的参数,增强注解的灵活性和可扩展性。
@Retention(RetentionPolicy.RUNTIME)
@interface Permission {
    Role role() default Role.USER;
    enum Role {
        ADMIN, USER
    }
}
@Permission(role = Role.ADMIN)
class AdminClass {
    // 类的定义
}
这些技巧可以帮助您更有效地利用 Java 枚举类,使代码更加简洁、清晰和易于维护。
五. 使用情景
-  表示有限的、固定的状态或选项 - 例如,订单的状态(已下单、已支付、已发货、已完成、已取消)。
- 文件的打开模式(只读、只写、读写)。
 
-  替代魔法数字或字符串常量 - 避免在代码中直接使用不具名的数字或字符串来表示特定的含义,提高代码的可读性和可维护性。
 
-  定义一组相关的常量 - 比如方向(东、南、西、北)、季节(春、夏、秋、冬)等。
 
-  配置选项 - 当系统有一些可配置的选项,且这些选项是有限且明确的时候,使用枚举可以更清晰地表达这些选项。
 
-  表示类型安全的标志或标识 - 例如,权限级别(管理员、普通用户)。
 
-  用于策略模式 - 不同的枚举值可以对应不同的处理策略或算法。
 
-  数据库映射 - 将枚举值与数据库中的特定值进行映射。
 
-  设计模式中的应用 - 例如在状态模式中,状态可以用枚举来表示。
 
六. 总结
定义:
 使用 enum 关键字来定义枚举类。
enum EnumName {
    ENUM_VALUE1,
    ENUM_VALUE2,
    // 更多枚举值
}
特点:
- 枚举类是一种特殊的类,不能被实例化,只能包含枚举值。
- 每个枚举值都是一个静态的、最终的实例。
属性:
 可以为枚举值添加属性来存储相关数据。
enum Season {
    SPRING("温和"), SUMMER("炎热"), AUTUMN("凉爽"), WINTER("寒冷");
    private String description;
    Season(String description) {
        this.description = description;
    }
    public String getDescription() {
        return description;
    }
}
方法:
- 可以定义普通方法和抽象方法。
- 普通方法可以被所有枚举值共享和调用。
- 抽象方法需要每个枚举值提供具体的实现。
构造方法:
- 构造方法必须是私有的,以防止外部创建枚举实例。
- 可以通过构造方法为枚举值初始化属性。
常用方法:
values():返回包含所有枚举值的数组。
valueOf(String name):根据输入的字符串名称返回对应的枚举值,若不存在则抛出异常。
ordinal():返回枚举值在定义中的索引位置(从 0 开始)。
用途:
- 提供一种类型安全的方式来表示一组固定的常量值。
- 增强代码的可读性和可维护性。
- 可以在枚举值上附加相关的行为和数据。
总之,枚举类在 Java 中是一种强大且有用的工具,适用于需要定义一组有限的、预定义常量的场景,能够有效地提高代码的质量和可理解性。


















