Java 枚举类的使用

本文详细介绍了Java枚举的七种常见用法,包括单参数、双参数枚举、接口聚合多个枚举、枚举类初始化Map与List以及在注解中使用枚举。通过实例展示了如何利用枚举提高代码的可读性和可维护性,特别是在处理固定选项和映射关系时的便捷性。
摘要由CSDN通过智能技术生成

参考资料

  1. Java 枚举(enum) 详解7种常见的用法


一. 一个参数

// 性别枚举类
public enum SexTypes {

    男性("1"),
    女性("2");
    
    private String code;

    SexTypes(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }

    // 根据code获取枚举类对象,例如根据1获取男性枚举类对象;根据2获取女性枚举类对象
    public static SexTypes fromCode(String code) {

        return Arrays.stream(SexTypes.values())
                .filter(item -> item.code.equals(code))
                .findAny()
                .orElse(null);
    }
    
    // 根据汉字类获取枚举类对应,例如根据男性获取男性枚举类对象;根据女性获取女性枚举类对象
    public static SexTypes fromName(String name) {

        return Arrays.stream(SexTypes.values())
                .filter(item -> item.name().equals(name))
                .findAny()
                .orElse(null);
    }
}

// 使用(通过枚举类来将汉字翻译为code)
Strnig sexType = "男性";
SexTypes fromNameSex = SexTypes.fromName(sexType);
// 通过枚举类对象获取code
Strnig code = fromNameSex.getCode();
// 通过枚举类对象获取枚举类名称
String name = fromNameSex.name();

二. 两个参数

// 依赖内容枚举类
public enum IrainaiyouTypes {

    依頼1(new BigDecimal(1), 2),
    依頼2(new BigDecimal(2), 2),
    依頼3(new BigDecimal(3), 10),
    依頼4(new BigDecimal(4), 10),
    依頼5(new BigDecimal(5), 4),
    依頼6(new BigDecimal(6), 2),
    依頼7(new BigDecimal(7), 1);

    // code
    private BigDecimal code;
    // 通知者人数
    private int tuchiNinzu;

    // 构造方法
    IrainaiyouTypes(BigDecimal code, int tuchiNinzu) {
        this.code = code;
        this.tuchiNinzu = tuchiNinzu;
    }

    public BigDecimal getCode() {
        return code;
    }

    public int getTuchiNinzu() {
        return tuchiNinzu;
    }

    public static IrainaiyouTypes fromCode(BigDecimal code) {

        for (IrainaiyouTypes item : IrainaiyouTypes.values()) {
            if (item.code.equals(code)) {
                return item;
            }
        }
        return null;
    }
}

// 使用(可以不直接硬编码code,而是通过汉字这种有语义的方式获取,增加了可读性)
BigDecimal code = IrainaiyouTypes.依頼1.getCode();
int tuchiNinzu = IrainaiyouTypes.依頼1.getTuchiNinzu();

三. 接口聚合多个枚举类

import java.util.Arrays;

// 枚举类的聚合接口
public interface AggregationEnum {
	
	String getCode();
	
	// ⏹咖啡枚举类
	enum Coffee implements AggregationEnum {
		
		黑咖啡,
		低卡咖啡,
		拿铁,
		卡布奇诺;

		@Override
		public String getCode() {
			return null;
		}
	}
	
	// ⏹性别枚举类
	enum SEX implements AggregationEnum {("1"),("2");
		
		String code; 

		SEX(String code) {
			this.code = code;
		}
		
		@Override
		public String getCode() {
			return code;
		}
		
		// 根据code获取枚举类对象
		public static SEX fromCode(String code) {
			return Arrays.stream(SEX.values())
						.filter(item -> item.code.equals(code))
						.findAny()
						.orElse(null);
		}
		
		// 根据名称获取枚举类对象
		public static SEX fromName(String name) {
			return Arrays.stream(SEX.values())
						.filter(item -> item.name().equals(name))
						.findAny()
						.orElse(null);
		}
	}
}

使用

// 使用接口聚合枚举类
Coffee[] coffees = AggregationEnum.Coffee.values();
Arrays.stream(coffees).forEach(item -> {
	System.out.println(item.name());
});
System.out.println("=== === ===");

SEX[] sexs = AggregationEnum.SEX.values();
Arrays.stream(sexs).forEach(item -> {
	System.out.println("名称为: " + item.name() + ", code为: "+ item.getCode());
});
/*
	BLACK_COFFEE
	DECAF_COFFEE
	LATTE
	CAPPUCCINO
	=== === ===
	名称为: 男, code为: 1
	名称为: 女, code为: 2
*/

四. 枚举类初始化Map与List

⏹枚举类接口

public interface EnumValueName {

    Integer getValue();

    String getName();
}

⏹属性中包含List与Map的枚举类

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public enum GenderEnum implements EnumValueName {

    MALE(1, "男"),
    FEMALE(0, "女");

    // 性别值数组
    public static final List<Integer> genderValueList = Arrays.stream(values()).map(GenderEnum::getValue).collect(Collectors.toList());

    // 性别名数组
    public static final List<String> genderNameList = Arrays.stream(values()).map(GenderEnum::getName).collect(Collectors.toList());

    // 性别值与性别名Map
    public static final Map<Integer, String> genderValNameMap = Arrays.stream(values()).collect(
            Collectors.toMap(
                GenderEnum::getValue,
                GenderEnum::getName
            )
    );

    // 性别名与性别值Map
    public static final Map<String, Integer> genderNameValMap = Arrays.stream(values()).collect(
            Collectors.toMap(
                GenderEnum::getName,
                GenderEnum::getValue
            )
    );

    // 性别值
    private final Integer value;

    // 性别名
    private final String name;

    GenderEnum(Integer value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public Integer getValue() {
        return value;
    }

    @Override
    public String getName() {
        return name;
    }
}

⏹使用

// 获取性别枚举类总的所有性别名称List
List<String> genderNameList = GenderEnum.genderNameList;
System.out.println(genderNameList);  // [男, 女]

// 获取性别枚举类总的所有性别值List
List<Integer> genderValueList = GenderEnum.genderValueList;
System.out.println(genderValueList);  // [1, 0]

// 获取性别枚举类总的所有性别值与性别名Map
Map<Integer, String> genderValNameMap = GenderEnum.genderValNameMap;
System.out.println(genderValNameMap);  // {0=女, 1=男}

// 获取性别枚举类总的所有性别名与性别值Map
Map<String, Integer> genderNameValMap = GenderEnum.genderNameValMap;
System.out.println(genderNameValMap);  // {女=0, 男=1}

// 获取所有的枚举类对象
GenderEnum[] genderEnums = GenderEnum.values(); 
// ※打印的是枚举类对象
System.out.println(Arrays.toString(genderEnums));  // [MALE, FEMALE]

五. 在注解中使用枚举类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 标记作用于方法上
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Screen {

    // 数组,可以指定多个属性
    CONTROLLER[] controllers() default {CONTROLLER.NONE};
    // 只能指定一个属性
    CONTROLLER test() default CONTROLLER.INPUT;

    // ⏹在注解类中内部定义枚举类,方便指定类型
    public static enum CONTROLLER {
        NONE, INPUT, OUTPUT, INOUT;
    }
}
  • 使用注解的同时,使用枚举类指定参数
@Screen(controllers = {Screen.CONTROLLER.INOUT, Screen.CONTROLLER.OUTPUT},
        test = Screen.CONTROLLER.INOUT)
@GetMapping("/init")
public ModelAndView init() {

    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("test2");
    return  modelAndView;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值