Java 枚举使用总结

目录

1、枚举基础

  1.1、创建枚举最简单的方式

  1.2、简单使用

2、枚举的构造方法

  2.1、使用注释方式说明

  2.2、使用构造方法

  2.3、使用带有构造器的枚举

3、就这些了?

  3.1、需求 

  3.2、使用Map实现

  3.3、枚举结合Map

  

  

 

 

 

1、枚举基础

  1.1、创建枚举最简单的方式

package cn.ganlixin.demo.enums;

/**
 * 描述:  季节枚举类
 */
public enum  SeasonEnum {

    // 枚举值之间使用逗号隔开,而不是分号
    SPRING, SUMMER, AUTUMN, WINNER;
}

  

  1.2、简单使用

@Test
public void testUseSeasonEnum() {
    System.out.println(SeasonEnum.AUTUMN);      // AUTUMN

    // 获取枚举类中定义的所有枚举项(每一项都是枚举,而不是字符串)
    final SeasonEnum[] values = SeasonEnum.values();
    for (SeasonEnum season : values) {
        System.out.print(season +" ");  // SPRING SUMMER AUTUMN WINTER
    }

    // 根据传入的字符串,获取与字符串同名的枚举项(如果没有字符串同名的枚举项,则会报错)
    final SeasonEnum winter = SeasonEnum.valueOf("WINTER");
    System.out.println(winter);         // WINTER

    // 枚举项的比较
    System.out.println(SeasonEnum.WINTER == SeasonEnum.WINTER); // true
    // 字符串不能直接与枚举进行比较
    //System.out.println("WINTER" == SeasonEnum.WINTER);
    // System.out.println(Objects.equals("WINTER", SeasonEnum.WINTER)); // false
}

    

2、枚举的构造方法

  2.1、使用注释方式说明

  虽然可以通过给枚举项增加注释的方式来表达枚举项的含义,但是对于打包发布后,注释是删掉的,这时就不好了

package cn.ganlixin.demo.enums;

/**
 * 描述:  季节枚举类
 */
public enum  SeasonEnum {

    // 枚举值之间使用逗号隔开,使用注释的方式说明枚举项的含义
    SPRING, // 春天
    SUMMER, // 夏天
    AUTUMN, // 秋天
    WINTER; // 冬天
}

  

  2.2、使用构造方法

package cn.ganlixin.demo.enums;

/**
 * 描述:  季节枚举类
 */
public enum  SeasonEnum {

    // 枚举值定义。枚举值之间使用逗号隔开,使用构造方法设置
    SPRING("春天"),
    SUMMER("夏天"),
    AUTUMN("秋天"),
    WINTER("冬天");

    // 枚举项的说明(比如注释"春天")
    String description;
    // 还可以自己加其他字段

    // 创建一个构造方法
    SeasonEnum(String description) {
        this.description = description;
    }

    // 获取枚举项描述
    public String getDescription() {
        return description;
    }

//    一般不建议提供setter,因为枚举类不应该被改变(包括信息描述)
//    public void setDescription(String description) {
//        this.description = description;
//    }
}

  需要注意的是,上面SeasonEnum的各部分代码顺序不能更改,也就是说枚举项定义必须在其他代码之前(包括构造方法、属性、getter)。  

 

  2.3、使用带有构造器的枚举

@Test
public void testSeasonEnumWithConstructor() {
    System.out.println(SeasonEnum.AUTUMN);                  // AUTUMN

    // 每一个枚举项都默认包含name方法,返回枚举项的字符串类型
    System.out.println(SeasonEnum.AUTUMN.name());           // AUTUMN
    
    // 调用方法获取枚举项的描述
    System.out.println(SeasonEnum.AUTUMN.getDescription()); // 秋天
}

  

3、就这些了?

  看完上面的定义和使用方式,你觉得枚举就这些了吗?的确,枚举就这内容,但是在真实开发工作中,还是不够的。

  

  3.1、需求1  

  比如,我想根据一个字符串,获取枚举类中同名的枚举项,但是返回的是枚举项的描述:

  伪代码如下:

String item = "xxx";

// 传入字符串获取对应的描述,而不是枚举项
String desctiption = SeasonEnum.getDescription(item);

  

  3.2、使用Map实现

  一个简单的方式就是通过使用不可变Map来实现,这里就不掩饰了

 

  3.3、枚举结合Map

  可以使用枚举和Map结合的方式,既保留了枚举的功能,也可以使用Map的功能

package cn.ganlixin.demo.enums;

import java.util.HashMap;
import java.util.Map;

/**
 * 描述:  季节枚举类
 */
public enum  SeasonEnum {

    // 枚举值之间使用逗号隔开,使用构造方法设置
    SPRING("春天"),
    SUMMER("夏天"),
    AUTUMN("秋天"),
    WINTER("冬天");

    // 用来存枚举项(字符串类型)与description的对应关系
    private static final Map<String, String> SeasonEnumMap = new HashMap<>();

    static {
        // 将枚举项的名称与描述存入map
        for (SeasonEnum season : values()) {
            SeasonEnumMap.put(season.name(), season.getDescription());
        }
    }

    // 枚举项的说明(比如注释"春天")
    String description;

    // 创建一个构造方法
    SeasonEnum(String description) {
        this.description = description;
    }
    
    // 获取枚举项描述
    public String getDescription() {
        return description;
    }

    /**
     * 根据字符串类型的枚举项,获取描述
     * @param season
     * @return
     */
    public static String fromSeasonName(String season) {
        return SeasonEnumMap.get(season);
    }
}

  

  使用示例

@Test
public void testEnumWithMap() {
    System.out.println(SeasonEnum.fromSeasonName("WINTER"));     // 冬天

    System.out.println(SeasonEnum.fromSeasonName("NotExists"));  // null
}

  

 

posted @ 2019-08-15 00:28  寻觅beyond  阅读(519)  评论(0编辑  收藏  举报
返回顶部