java新特性详解—enum和record

java新特性详解—enum和record

最近在传dto、vo和自定义错误码类时,经常要用到这enum和record类。但是这两个类网上的讲解并不多,属于java的新特性。今天就带大家来看看如何使用这两个类

一、enum

enum主要用于自定义错误码,所以现在先上正确代码

/**
 * 返回结果枚举类
 */
@Getter//4.提供实例变量的get方法
public enum ResultCodeEnum
{
    //1.创建对象(默认修饰符public static final ResultCodeEnum)
    //200 OK 表示成功,其它都表示错误
    SUCCESS(2000,"success"),
    //400 Bad Request 客户端错误,客户端发送的请求无效
    PARAMS_ERROR(4000,"请求参数错误"),
    NULL_ERROR(4001,"请求数据为空"),
    //401 Unauthorized 没有权限
    NOT_LOGIN_ERROR(4010,"未登录"),
    NO_AUTH_ERROR(4011,"没有权限"),
    //403 Forbidden 禁止访问,表示服务器理解请求客户端的请求,但是拒绝执行这个请求
    FORBIDDEN_ERROR(4030, "禁止访问"),
    //404 Not Found 服务器无法找到请求的资源
    NOT_FOUND_ERROR(4040, "请求数据不存在"),
    //500 Internal Server Error 服务器错误
    SYSTEM_ERROR(5000,"系统内部异常"),
    OPERATION_ERROR(5001, "操作失败");
    //2.声明当前类的对象的实例变量
    private final Integer code;
    private final String message;

    //3.私有化的构造器(默认修饰符private)
    ResultCodeEnum(Integer code, String message)
    {
        this.code = code;
        this.message = message;
    }
}

SUCCESS(2000,"success")这行代码实际上是调用私有化的构造方法,创建一个ResultCodeEnum的静态类,里面的参数是code和message。以后要调用code可以直接写:ResultCodeEnum.SUCCESS.getCode()

因为是私有化的构造方法,所以外界不可以创建ResultCodeEnum对象。同时没有set方法、实例变量是final修饰,所以也不能修改已经创建好的对象中的code、message。只能是在类内部自己创建一个对象,然后外界既不能创建对象、又不能修改对象中的属性。博主表示:这种代码写出来真的太优雅了! elegant!

enum补充内容:

image-20231229151252330
RoleEnum roleEnum = RoleEnum.valueOf("ADMIN"); 
System.out.println(roleEnum.name());      //ADMIN
System.out.println(roleEnum.toString());  //ADMIN
System.out.println(roleEnum.ordinal());   //0
System.out.println(RoleEnum.values()[0]); //ADMIN
System.out.println(RoleEnum.values()[1]); //USER

枚举类中不能重写hashcode和equals方法,同时由于枚举类默认继承了Enum,Enum中有equals和hashcode方法(和Object的一样,equals是==号)。所以调用equals方法时,两个枚举类只有是同一个实例时才相同,如果是不同实例就算属性一样,那么也不会相同

enum接受参数:

public enum RoleEnum{
    ADMIN(1),
    USER(2);
    private final Integer number;
    RoleEnum(Integer number){
        this.number = number;
    }
}
image-20231229152347999
public record RegisterRequest(@NotBlank String username,
                              @NotBlank String password,
                              @NotNull RoleEnum role){}
  • 不管传入的role是Integer还是字符串,都会构造出相应的对象。传1或传ADMIN,都会构造出ADMIN对象。但如果传的参数不对,会抛出HttpMessageNotReadableException

二、record

record类一出来,完全可以用它来做dto和vo。先简单写一个dto

public record LoginParam(@NotBlank(message = "用户名不能为空")String username,
                         @NotBlank(message = "密码不能为空")String password){
}

注意事项:

  • record类中成员的默认修饰符为private final,同时默认包含了全参构造函数,get、hashcode、equals、toString方法。要调用username可以写:loginParam.username()

  • 不能再在{}里面写成员变量,但可以使用注解,写方法等

  • record类的默认修饰符为final,所以该类不能被其它类继承。同时record类隐式地继承了java.lang.Record,所以也不能显示地声明继承任何其他类

  • record类中,字段的初始化只能在构造函数中进行,它限制了在类体中进行赋值操作的能力。例如:String username="weng"是不被允许的。因为record类的字段都是final的,这意味着一旦字段被初始化,就不能再改变其值。如果字段直接赋值,那么全参构造函数中就无法赋值了。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值