Java枚举类

1 枚举类介绍

对于对象有限且固定的类,使用枚举类。 特别是定义一组常量是,强烈建议使用枚举类。

如:

  • 星期:Monday, Tuesday, …, Sunday
  • 季节:Spring, summer, autumn, winter
  • 性别:male, female

2 自定义枚举类

jdk5.0之前,枚举类需要自己定义。因为枚举类用于对象有限且固定的情况,所以自己定义的枚举类一般建议:

  • 构造方法私有private,防止构造新的对象。枚举值要调用对应的构造器来创建
  • 枚举类的成员声明为 private final
  • 枚举类的对象成员声明为 public static final

简单的例子:

/**
 * Gender枚举类,对性别进行枚举
 */
class Gender {
    // 属性声明
    private final String name;
    private final String describe;

    // 私有化构造器
    private Gender(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }

    // 实例化枚举类能提供的有限个对象
    public static final Gender MAN = new Gender("man", "Gender: man");
    public static final Gender WOMAN = new Gender("woman", "Gender: woman");

    // 如果有必要,可以提供get方法获取属性信息
    public String getName() {
        return name;
    }

    public String getDescribe() {
        return describe;
    }
    
}

3 通过enum定义枚举类

使用enum关键字定义枚举类。(enum关键字和class、interface的作用相似)

enum Gender2 {
    // 首行列出所有枚举对象,直接 `对象名(构造方法参数)` ,对象之间用 `,` 隔开
    MAN("man", "gender: man"),  // public static final Gender2 MAN = new Gender2("man", "gender: man")
    WOMAN("woman", "gender: man");

    // 属性声明
    private final String name;
    private final String describe;

    // 私有化构造器
    private Gender2(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }

    // 如果有必要,可以提供get方法获取属性信息
    public String getName() {
        return name;
    }

    public String getDescribe() {
        return describe;
    }
}
  • 枚举类注意事项:
    • 枚举类默认继承java.lang.Enum类。

    java.lang.Enum类常用方法
      Enum类的常用方法,可以由用户自己定义的枚举类使用。(继承)

    • values():返回枚举类型的对象数组
    • valueOf(String str):将str字符串转化为同名的枚举类对象
    • toString():返回当前枚举类对象的名称
    • 非抽象枚举类默认使用final修饰,不能派生子类。

注意

  1. 枚举类的实例通过类名.实例名调用。
  2. switch的控制表达式可以是任何枚举类型,case表达式的值可以直接用枚举对象的名字,不需要添加枚举类作为限定。
Gender2 b = Gender2.MAN;
switch (b) {
	case MAN: System.out.println("man");break;
    case WOMAN: System.out.println("woman");break;
}

4 枚举类实现接口

  枚举类可以和普通类一样实现接口,但这种实现使得每个枚举实例的接口实现方法都一样。若要为每个枚举值提供不同实现方式,参照匿名对象实现:

//接口
public interface GenderDesc{
    void info();
}
//枚举类实现接口
public enum Gender implements GenderDesc{
    MALE("男"){
        public void info(){
            System.out.println("这个枚举值代表男性");
        }
    },
    FEMALE("女"){
         public void info(){
            System.out.println("这个枚举值代表女性");
        }
    };
    private final String name;
    private Gender(String name){
        this.name=name;
    }
}

注意:此时的枚举值不是Gender枚举类的实例,而是Gender的匿名子类的实例。

5 抽象枚举类

  • 枚举类中有抽象方法时,系统自动为其添加abstract关键字,不能手动添加。
  • 枚举值中要重写枚举类的抽象方法。
package org.ywq.absenumclass;

public enum Operation {
	ADD {
		public double oper(double x, double y) {
			return x + y;
		}
	},
	SUB {
		public double oper(double x, double y) {
			return x - y;
		}
	},
	MUL {
		public double oper(double x, double y) {
			return x * y;
		}
	},
	DIV {
		public double oper(double x, double y) {
			return y == 0 ? y : x / y;
		}
	};
	// 抽象方法
	public abstract double oper(double x, double y);

	public static void main(String[] args) {
		System.out.println(Operation.ADD.oper(1.2, 2.1));
		System.out.println(Operation.SUB.oper(1.2, 2.1));
		System.out.println(Operation.MUL.oper(1.2, 2.1));
		System.out.println(Operation.DIV.oper(1.2, 2.1));
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值