枚举与记录

309 阅读3分钟

枚举(enum)

所谓枚举 -- 是一种取值范围固定在某个指定集当中的数据类型。 定义的语法:

public enum 枚举类型名{
   值选项1,值选项2,....,值选项n;

}

注意点: 1、这里的值选项是标识符,不是字符串; 2、这里的值选项是有顺序的; 3、值选项不能重复。

使用的语法:

枚举类型 变量 = 枚举类型.值选项;

枚举的本质

枚举其实是一个语法糖,在本质它是一个自动继承于Enum类的子类。 Enum类来自于java.lang包,是一个抽象类。Enum拥有的属性行为,所有的枚举类型都拥有。

属性

name -- 选项名字 String

ordinal -- 选项的序号 int

这两个属性都是私有的常量,也就是说外部不可访问,同时一旦产生Enum对象以后其值也不能修改。

非static方法

name() -- 返回选项的名字

 Season now = Season.SPRING;
 now = Season.AUTUMN;
 System.out.println(now.name());

ordinal() -- 返回选项的序号

 now.ordinal();

compareTo() -- 比较两个枚举对象的大小,返回的是它们的序号差

System.out.println(now.compareTo(Season.SPRING));

另外凡是来自于Object类的方法,它都有。包括: equals() -- 判断两个枚举对象是否相等 toString()-- 返回枚举的字符串描述,其实重写后就是返回的name

static方法

values() -- 以数组的形式返回这个枚举类里面有哪些选项。

 Season [] all = Season.values();
        for (Season season : all){
            System.out.println(season);
        }

valueof -- 根据字符串名获取枚举实例

 System.out.println(Season.valueOf("SPRING"));

注意:

  1. enum枚举就是类类型;
  2. 父类是Enum是一个抽象类,来自于java.lang包;
  3. 常用方法:
`compareTo()`
`equals()`
`values()`

枚举的高阶使用

  1. 在自定义的enum类型中可以增加属性;

    private String value;//存放每个成员的中文打印值
    
  2. 在自定义的enum类型中可以增加行为;

    普通方法(静态或非静态)

    public static Season  getSeasonByChinese(String chinese){
            return switch (chinese){
                case "春":
                case "春天":
                    yield  Season.SPRING;
                case "夏":
                case "夏天":
                    yield  Season.SUMMER;
                case "秋":
                case "秋天":
                    yield  Season.AUTUMN;
                case "冬":
                case "冬天":
                    yield  Season.WINTER;
    
                default:
                    throw new IllegalStateException("Unexpected value: " + chinese);
            };
        }
    
        public String getChineseByEnum(Season season){
            return switch (season){
                case SPRING -> "春";
                case SUMMER -> "夏";
                case AUTUMN-> "秋";
                case WINTER-> "天";
                default -> throw new IllegalStateException("Unexpected value: " + season);
            };
        }
    }
    
    
  3. 在自定义的enum类型中可以重写从Enum中继承而来的方法

    @Override
    public String toString(){
        //TODO 
        return this.value
    }
    
  4. 在自定义的enum类型中可以增加构造(完成自我阅读学习)。

    枚举的构造只能是私有的

    private Season(String value){
        this.value = value;
    }
    

记录(record)

在JDK14当中,提供了一种新的类型叫做record(记录)。它是专门用来定义一种特殊类的“简化语法”。

什么样的特殊类呢? 专门用来存放属性值,且每个属性的值一旦确立不能修改。这种类的预设场景是在做数据传输的时候。 用传统语法做这种类的设计,写起来比较麻烦。因此专门设计了record类型的语法。

定义语法:

//这里()里面既可以称之为参数,也可以称为属性
public record 名字(书写上参数){

}

然后它自动生成带参构造,自动生成final属性,自动生成与属性名保持一致的get方法,自动重写toString()

record的本质

也是语法糖,它也是类类型,它父类是来自于java.lang.Record的抽象类。