java枚举的理解
2019-04-14 本文已影响0人
liangxifeng833
一.概念
- 枚举是一种独立的类型, 与class类是同级的关系.
- 让某个类型的变量的取值只能为若干个固定值中的一个, 否则编译器会报错.
- 枚举可以让编译器在编译的时候就可以控制程序非法赋值, 使用普通变量的方式在开发过程中无法做到.
- JDK1.5以后, 使用关键字
enum
定义一个新的类型, 称为枚举类型.
二.不使用枚举
- 定义EnumDemo类
/**
* Description: demo
* Create by liangxifeng on 2019-4-14
*/
public class EnumDemo {
public static final int RED = 0x1;
public static final int GREEN = 0x2;
public static final int BLUE = 0x3;
public int color;
@Test
public void test1(){
color = RED;
color = 4;
}
}
- 以上定义的类中有三个常量, 我们使用color变量可以存储三个常量的任意一个值, 但是color同时也可以存储int型的其他值, 我们并不能强制让color变量只允许存储三个常量中的任何一个值, 那么要实验这个效果, 我们就需要用到枚举.
三.使用枚举
- 使用
enum
关键字定义枚举, 实际上相当于定义一个类, 此类继承了 Enum类而已. Enum类中定义了如下三个方法:
image.png
- 先定义
Color
枚举类package com.soufang.esproject.lxf; /** * 定义一个枚举类型 */ public enum Color { /** * 对于枚举类型来说, 以下三个常量代表的是类型为Color的枚举对象. * RED是Color的一个对象 * GREEN也是Color的一个对象 * BLUE同样也是Color的一个对象. * 只不过这三个对象是在枚举类的内部事先给定好的, 其他的外面是不能在产生Color枚举类型对象的. * 也就是说枚举类型对象一定是在枚举类型内部来声明和定义的, 外部是不可以的. */ RED, GREEN, BLUE; }
- 定义Enum使用枚举类型
package com.soufang.esproject.lxf; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.EnumMap; import java.util.EnumSet; /** * Description: demo * Create by liangxifeng on 2019-4-14 */ public class EnumDemo { public static final int RED = 0x1; public static final int GREEN = 0x2; public static final int BLUE = 0x3; public int color; /** * 不使用枚举类类型, color可以存储除了以上三个常量之外, 还可以存储其他int类型的数据 */ @Test public void test1(){ color = RED; color = 4; } /** * 定义一个枚举类型的变量, 因为Color是个枚举类型 * 使用枚举类型 colorEnum只能赋值为Color中定义的三个对象. */ public Color colorEnum; @Test public void test2(){ colorEnum = Color.RED; //打印名称, 输出: RED System.out.println(colorEnum.name()); //打印需要, 输出: 0 System.out.println(colorEnum.ordinal()); //打印名称,输出: RED, 与.name()一致 System.out.println(colorEnum.toString()); //打印所属类型, 输出: com.soufang.esproject.lxf.Color System.out.println(colorEnum.getClass().getName()); //获取枚举中所有值, 输出: [RED, GREEN, BLUE] Color[] values = Color.values(); System.out.println(Arrays.toString(values)); } /** * set 和 map 的枚举类型 */ @Test public void test3(){ /** * 枚举set * 将Color中定义的所有枚举对象赋值到set集合中, 用来管理枚举元素的集合 */ EnumSet<Color> set = EnumSet.allOf(Color.class); for (Color c: set){ System.out.println(c); } /** * 枚举map * 泛型key要用枚举类型 */ EnumMap<Color,String> map = new EnumMap<>(Color.class); map.put(Color.RED,"red"); map.put(Color.GREEN,"green"); map.put(Color.BLUE,"blue"); } }