广州北大青鸟计算机职业培训学校
互联网技术培训、软件技术培训、大数据培训、云计算培训、数据分析培训信息网
当前位置:网站首页 > 软件教程 > Java技术 > 正文

惠州Java枚举一般应用在哪些场景?_北大青鸟IT计算机学校

作者:邓华发布时间:2021-03-29分类:Java技术浏览:1045


导读:Java枚举一般应用在哪些场景?最近惠州北大青鸟很多学员都在问这个问题,那么下面惠州北大青鸟学术部老师给大家解答一下这个问题。

Java枚举一般应用在哪些场景?最近惠州北大青鸟很多学员都在问这个问题,那么下面惠州北大青鸟学术部老师给大家解答一下这个问题。

一、组织常量

在 JDK1.5 之前,在 Java 中定义常量都是 public static final TYPE a 这样的形式。有了枚举,你可以将有关联关系的常量组织起来,使代码更加易读、安全,并且还可以使用枚举提供的方法。

二、枚举声明的格式

注:如果枚举中没有定义方法,也可以在最后一个实例后面加逗号、分号或什么都不加。

下面三种声明方式是等价的:

enum Color { RED, GREEN, BLUE }enum Color { RED, GREEN, BLUE, }enum Color { RED, GREEN, BLUE; }

三、switch 状态机

我们经常使用switch语句来写状态机。JDK7 以后,switch 已经支持 int、char、String、enum 类型的参数。这几种类型的参数比较起来,使用枚举的 switch 代码更具有可读性。

enum Signal {RED, YELLOW, GREEN}public static String getTrafficInstruct(Signal signal) {
   String instruct = "信号灯故障";    switch (signal) {        case RED:
           instruct = "红灯停";            break;        case YELLOW:
           instruct = "黄灯请注意";            break;        case GREEN:
           instruct = "绿灯行";            break;        default:            break;
   }    return instruct;
}

四、组织枚举

可以将类型相近的枚举通过接口或类组织起来。

但是一般用接口方式进行组织。

原因是:Java 接口在编译时会自动为 enum 类型加上 public static 修饰符;Java 类在编译时会自动为 enum 类型加上 static 修饰符。看出差异了吗?没错,就是说,在类中组织 enum,如果你不给它修饰为 public,那么只能在本包中进行访问。

例:在接口中组织 enum

public interface Plant {    enum Vegetable implements INumberEnum {
       POTATO(0, "土豆"),
       TOMATO(0, "西红柿");

       Vegetable(int number, String description) {            this.code = number;            this.description = description;
       }        private int code;        private String description;        @Override
       public int getCode() {            return 0;
       }        @Override
       public String getDescription() {            return null;
       }
   }    enum Fruit implements INumberEnum {
       APPLE(0, "苹果"),
       ORANGE(0, "桔子"),
       BANANA(0, "香蕉");

       Fruit(int number, String description) {            this.code = number;            this.description = description;
       }        private int code;        private String description;        @Override
       public int getCode() {            return 0;
       }        @Override
       public String getDescription() {            return null;
       }
   }
}

例:在类中组织 enum

本例和上例效果相同。

public class Plant2 {    public enum Vegetable implements INumberEnum {...}  // 省略代码
   public enum Fruit implements INumberEnum {...} // 省略代码}

五、策略枚举

EffectiveJava中展示了一种策略枚举。这种枚举通过枚举嵌套枚举的方式,将枚举常量分类处理。

这种做法虽然没有 switch 语句简洁,但是更加安全、灵活。

例:EffectvieJava 中的策略枚举范例

enum PayrollDay {
   MONDAY(PayType.WEEKDAY), TUESDAY(PayType.WEEKDAY), WEDNESDAY(
           PayType.WEEKDAY), THURSDAY(PayType.WEEKDAY), FRIDAY(PayType.WEEKDAY), SATURDAY(
           PayType.WEEKEND), SUNDAY(PayType.WEEKEND);    private final PayType payType;

   PayrollDay(PayType payType) {        this.payType = payType;
   }    double pay(double hoursWorked, double payRate) {        return payType.pay(hoursWorked, payRate);
   }    // 策略枚举
   private enum PayType {
       WEEKDAY {            double overtimePay(double hours, double payRate) {                return hours <= HOURS_PER_SHIFT ? 0 : (hours - HOURS_PER_SHIFT)
                       * payRate / 2;
           }
       },
       WEEKEND {            double overtimePay(double hours, double payRate) {                return hours * payRate / 2;
           }
       };        private static final int HOURS_PER_SHIFT = 8;        abstract double overtimePay(double hrs, double payRate);        double pay(double hoursWorked, double payRate) {            double basePay = hoursWorked * payRate;            return basePay + overtimePay(hoursWorked, payRate);
       }
   }
}

测试

System.out.println("时薪100的人在周五工作8小时的收入:" + PayrollDay.FRIDAY.pay(8.0, 100));System.out.println("时薪100的人在周六工作8小时的收入:" + PayrollDay.SATURDAY.pay(8.0, 100));

六、EnumSet和EnumMap

Java 中提供了两个方便操作 enum 的工具类—— EnumSet 和 EnumMap。

EnumSet 是枚举类型的高性能 Set 实现。它要求放入它的枚举常量必须属于同一枚举类型。EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其它的 Map 实现(如 HashMap)也能完成枚举类型实例到值得映射,但是使用 EnumMap 会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值。这使得 EnumMap 的效率非常高。

// EnumSet的使用System.out.println("EnumSet展示");
EnumSet<ErrorCodeEn> errSet = EnumSet.allOf(ErrorCodeEn.class);for (ErrorCodeEn e : errSet) {
   System.out.println(e.name() + " : " + e.ordinal());
}// EnumMap的使用System.out.println("EnumMap展示");
EnumMap<StateMachine.Signal, String> errMap = new EnumMap(StateMachine.Signal.class);
errMap.put(StateMachine.Signal.RED, "红灯");
errMap.put(StateMachine.Signal.YELLOW, "黄灯");
errMap.put(StateMachine.Signal.GREEN, "绿灯");for (Iterator<Map.Entry<StateMachine.Signal, String>> iter = errMap.entrySet().iterator(); iter.hasNext();) {    Map.Entry<StateMachine.Signal, String> entry = iter.next();
   System.out.println(entry.getKey().name() + " : " + entry.getValue());
}

想了解更多关于Java的资讯,可以来惠州北大青鸟新方舟校区了解一下。

Java12.jpg

Java

标签:惠州计算机JAVA软件开发惠州计算机Java软件开发惠州计算机JAVA培训惠州计算机JAVA软件开发学校惠州计算机Java软件开发培训JAVAJava软件开发北大青鸟IT计算机学校北大青鸟IT软件学校北大青鸟IT学校


Java技术排行
标签列表
网站分类
文章归档
最近发表