Java 枚举一 Enum解析

1.enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。先来看可他的定义

public abstract class Enum<E extends Enum<E>>implements Comparable<E>, Serializable{
		//构造
	    protected Enum(String name, int ordinal) {
        	this.name = name;
        	this.ordinal = ordinal;
    }
}

是一个抽象类,泛型是Enum或者其子类,实现了比较接口和序列化接口
定义一个枚举:

public enum Enumeration {
    MON, TUE, WED, THU, FRI, SAT, SUN;
}

其实就是创建了7个枚举类型,编译器会创建7个相应的对象,继承于java.lang.Enum

2.枚举的静态方法valueOf,跟据字符串取得相对应的Enum实例

	/**
	 * valueOf源码
	 * @param enumType Enum或其子类的Class对象
	 * @param name 需要查找的name
	 * @return name对应的Enum 实例
	 */
	public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) {
		//enumType.enumConstantDirectory() : 返回一个key为具名值value为具体Enum实例的HashMap
		T result = enumType.enumConstantDirectory().get(name);
		if (result != null)
			return result;
		if (name == null)
			throw new NullPointerException("Name is null");
		throw new IllegalArgumentException("No enum constant " + enumType.getCanonicalName() + "." + name);
	}

3.将Enum 静态导入,如下MON不必用Enum来修饰了

import static lang.EnumDemo.*;

public class Enumeration {
	public static void main(String[] args) {
		EnumDemo ed = EnumDemo.MON;
		EnumDemo enumdemo = MON;
		System.out.println(enumdemo  == ed)}

4.自定义方法以及重写父类方法

public enum EnumDemo  {
	
	MON, TUE, WED, THU, FRI, SAT, SUN;
	//必须在声明的Enum实例之后定义变量
	private String str = "test";
	//可以定义构造器,在创建Enum实例是执行某些逻辑,但是编译器是不能让你new对象的
	EnumDemo() {
		System.out.println("执行了构造器"+this);
	}
	
	public static EnumDemo  getMON() {
		return EnumDemo.MON;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString();
	}
	
	public static void main(String[] args) {
		for (EnumDemo e : EnumDemo.values()) {
			System.out.println(e);
		}
	}

}

5.Enum 的switch

	//case 如果覆盖了所有的分支,可以不用写dufult语句,编译器不会警告
		switch (signal) {
		case RED:
			signal = Signal.YELLOW;
			break;
		case YELLOW:
			signal = Signal.GREEN;
			break;
		case GREEN:
			signal = Signal.RED;
			break;
		}

6.Enum的values()方法,对于values方法很神秘,在Enum的源码中我们并没有看到过这个方法,但却可以直接调用

	private enum Signal {
		GREEN, YELLOW, RED;
		void println() {
			System.out.println(this);
		}
	}
	public static void main(String[] args) {
		for (Signal s : Signal.values()) {
			s.println();
		}
	}
其实是编译器添加了values方法,并且还新增了一个重载的valueOf方法,如下是编译器创建的Enum类
	final class Signal extends Enum{
		public static final Signal GREEN;
		public static final Signal YELLOW;
		public static final Signal RED;
		public static final Signal[] values(){
			...
		}
		public static final Signal valueOf(String name){
			...
		}
	}
以上我们已经基本可以了解为何Enum类型可以Signal.GREEN这样直接调用,其实就是一个静态常量,
可以看到Signal继承了Enum,所以他不能在继承被的类了,被final修饰,不能被子类继承,添加了values,valueOf这两个静态方法,
所以如果你将Signal向上转型为Enum就不能再使用这些方法和常量了
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将 MySQL 的 int 类型映射为 Java 枚举类型需要进行两个步骤:将 MySQL 中的 int 类型转换为 Java 中的枚举变量,然后将枚举变量反解析回 MySQL 的 int 类型。 首先,在 Java 中定义一个枚举类型,用于存储 MySQL 中 int 类型的值与其对应的枚举变量。假设在 MySQL 中有一个表名为 `user`,其中有一个 `gender` 字段,它的类型为 int,表示性别,0 表示男性,1 表示女性,那么在 Java 中可以定义一个枚举类型来存储这些值: ```java public enum Gender { MALE(0), FEMALE(1); private final int value; Gender(int value) { this.value = value; } public int getValue() { return value; } } ``` 在定义枚举类型时,需要为每个枚举变量指定一个 int 值,并提供一个 getValue() 方法,用于获取这个枚举变量对应的 int 值。 接下来,在 Java 中反解析 MySQL 中的 int 值,将其转换为对应的枚举变量。假设在 Java 中有一个 User 类,用于表示 MySQL 中的 user 表中的一条记录,其中的 gender 字段对应着上面定义的 Gender 枚举类型,那么可以在 User 类中定义一个 getGender() 方法,用于获取 gender 字段对应的枚举变量: ```java public class User { // 其他属性和方法 public Gender getGender() { return Gender.values()[gender]; } } ``` 在 getGender() 方法中,使用 `Gender.values()` 方法获取 Gender 枚举类型中所有的枚举变量,然后通过 gender 字段的值来获取对应的枚举变量。 这样就完成了从 MySQL 中的 int 类型到 Java 中的枚举变量的转换。如果需要将枚举变量反解析回 MySQL 的 int 类型,可以在 User 类中定义一个 setGender() 方法,用于设置 gender 字段的值: ```java public class User { // 其他属性和方法 public void setGender(Gender gender) { this.gender = gender.getValue(); } } ``` 在 setGender() 方法中,使用枚举变量的 getValue() 方法获取对应的 int 值,并将其赋值给 gender 字段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值