1. 程式人生 > >Java類列舉

Java類列舉

列舉作為程Java中一道靚麗的風景線,更易讀、更加安全、功能非常強大
  • 欄位

    • 無硬性約束
  • 方法

    • 普通方法
    • 抽象方法(可為每個列舉內部類新增獨立的自定義方法)
  • 建構函式

    • 建構函式必須為private

    直接上程式碼


package com.td.enums;

import java.util.Arrays;
import java.util.Optional;

/**
 * 簡單計算器
 */
public enum Operation {
	PLUS
("+") { double apply(double x, double y) {return x + y;} }, MINUS("-") { double apply(double x, double y) {return x - y;} }, TIMES("*") { double apply(double x, double y) {return x * y;} }, DIVIDE("/") { double apply(double x, double y) {return x / y;} }; private final String symbol; Operation
(String symbol) {this.symbol = symbol;} abstract double apply(double x, double y); public static void main(String[] args) { Arrays.asList(Operation.values()).forEach(v -> { double result = v.apply(1.2, 2); System.out.println(result); }); System.out.println(Operation.getById("-")
.get().name()); } public static Optional<Operation> getById(String id) { return Arrays.stream(Operation.values()).filter(operation -> operation.symbol.equals(id)).findAny(); } } /** * 工資計算器 */ enum PayrollDay { MONDAY(PayType.WEEKDAY), TUESDAY(PayType.WEEKDAY), WEDNESDAY(PayType.WEEKDAY), THURSDAY(PayType.WEEKDAY), FRIDAY(PayType.WEEKDAY), STATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND); private final PayType payType; private 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 hours, double payRate); double pay(double hoursWorked, double payRate) { double basePay = hoursWorked * payRate; return basePay + overtimePay(hoursWorked, payRate); } } public static void main(String[] args) { Arrays.asList(PayrollDay.values()).forEach(v -> { double result = v.pay(10, 100); System.out.println(result+"--"+v.ordinal()); }); } }