Enum介绍

public enum Color {
    RED, YELLOW, BLUE;
}

说明

使用的是enum关键字而不是class

多个枚举变量之间用 逗号 隔开

枚举变量名大写,多个单词之间用 _ 隔开。 如。 ALL_NUM...

定义完枚举变量后, 用分号 结束。如果只有枚举变量,而没有自定义变量,分号可以省略。

使用 只需要【类名.变量名】就可以了,和使用静态变量一样。

方法

values()

这个方法会返回包括所有枚举变量的数组

for (Color color : Color.values()) {
	// 下标
	System.out.println(color.ordinal());
	// 枚举变量名字
	System.out.println(color.name());
	// 同上
	System.out.println(color.toString());
}
// 比较的是下标
System.out.println(Color.valueOf("YELLOW").compareTo(Color.valueOf("BLUE")));

valueOf(String name)

它的作用是传来一个字符串,然后将它转变为对应的枚举变量 .

字符串和定义枚举变量的字符串必须一样,并且区分大小写。如果不存在会抛出异常。java.lang.IllegalArgumentException

public enum Weekday {
    MON(1),TUS(2),WED(3),THU(4),FRI(5),SAT(6),SUN(0);

    private int index;

    private Weekday(int index){
        this.index = index;
    }
}

说明

定义的枚举变量 必须 在第一行。以 分号结束。

构造函数只能是 private 的。否则 编译不通过

自定义的 index 和 下标 不冲突。

枚举类中的抽象类

实例:

public enum Color {
    RED() {
        @Override
        public Color getNextColor() {
            return YELLOW;
        }
    },
    YELLOW(){
        @Override
        public Color getNextColor() {
            return BLUE;
        }
    },
    BLUE(){
        @Override
        public Color getNextColor() {
            return RED;
        }
    };

		/**
     * 获取下一种颜色
     * @return
     */
    public abstract Color getNextColor();
}
Color yellow = Color.valueOf("YELLOW");
System.out.println(yellow.getNextColor());

// BLUE

枚举类的原理:

public enum Weekday {
    MON(1),TUS(2),WED(3),THU(4),FRI(5),SAT(6),SUN(0);

    private int index;

    private Weekday(int index){
        this.index = index;
    }
}

javap 反编译 Weekday.class

public final class enums.Weekday extends java.lang.Enum<enums.Weekday> {
  public static final enums.Weekday MON;
  public static final enums.Weekday TUS;
  public static final enums.Weekday WED;
  public static final enums.Weekday THU;
  public static final enums.Weekday FRI;
  public static final enums.Weekday SAT;
  public static final enums.Weekday SUN;
  public static enums.Weekday[] values();
  public static enums.Weekday valueOf(java.lang.String);
  static {};
}

是 final 类,不能被继承。

继承了 java.lang.Enum 类。只能实现接口了。

在Color枚举类中定义的 RED、、、本身是一个 Color对象的引用。Color RED = new Color(); 使用匿名内部类方式:

Color RED = new Color() {
	@override
  public Color getNextColor() {
  	return YELLOW;
  }
}
在枚举类中  只用写  RED(){...} JVM会完成其它操作

枚举类在switch中应用

switch (color) {
case RED:
	color = Color.GREEN;
	break;
case YELLOW:
	color = Color.RED;
	break;
case GREEN:
	color = Color.YELLOW;
	break;
}

枚举类实现接口

public interface Behaviour {
    void print();
    String getInfo();
}
public enum Weekday implements Behaviour{
    MON(1),TUS(2),WED(3),THU(4),FRI(5),SAT(6),SUN(0);

    private int index;

    Weekday(int index){
        this.index = index;
    }

    @Override
    public void print() {
        System.out.println(this.index + ":" + toString());
    }

    @Override
    public String getInfo() {
        return toString();
    }
}

枚举实现 单例模式

public enum DataSourceEnum {
    DATASOURCE;
    private DBConnection connection = null;
    private DataSourceEnum() {
        connection = new DBConnection();
    }
    public DBConnection getConnection() {
        return connection;
    }
} 
posted @ 2019-01-03 11:28  wansw  阅读(1590)  评论(0编辑  收藏  举报