枚舉

概念

enum 的全稱爲 enumeration, 是 JDK 1.5 中引入的新特性。
在Java中,被 enum 關鍵字修飾的類型就是枚舉類型。

枚舉的方法

  • values():返回 enum 實例的數組,而且該數組中的元素嚴格保持在 enum 中聲明時的順序。
  • name():返回實例名。
  • ordinal():返回實例聲明時的次序,從0開始。
  • getDeclaringClass():返回實例所屬的 enum 類型。
  • equals() :判斷是否爲同一個對象。

注意:可以使用 == 來比較enum實例。此外,java.lang.Enum實現了Comparable和 Serializable 接口,所以也提供 compareTo() 方法。

特點

1.JDK7後,switch語句支持enum類型參數了。

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;
}

2.除了不能繼承,枚舉基本可以看做是一個常規的類。

3.組織枚舉是,如果不用接口的方式,加上public修飾符才能全局訪問。

Java接口在編譯時會自動爲enum類型加上public static修飾符;Java類在編譯時會自動爲 enum 類型加上static修飾符。

4.與C/C++中不同,Java中不允許使用=爲枚舉常量賦值。

實例-接口約束枚舉

/**
*實現接口約束枚舉的方法
*/
public interface INumberEnum {
    int getCode();
    String getDescription();
}

public enum ErrorCodeEn2 implements INumberEnum {
    OK(0, "成功"),
    ERROR_A(100, "錯誤A"),
    ERROR_B(200, "錯誤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 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的使用
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());
}

參考:https://www.cnblogs.com/jingmoxukong/p/6098351.html

發佈了28 篇原創文章 · 獲贊 17 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章