02.Lombok- 有参构造和无参构造@NoNull注解

668 阅读2分钟

02.Lombok-

@NonNull 注解

看一个案例

package com.lzh;

import lombok.extern.slf4j.Slf4j;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh
 * @Project:1024shop-manager
 * @name:NonNullTest
 * @Date:2023/3/29 下午5:05
 * @Filename:NonNullTest
 * @Description:判断login()方法传入参数
 * @Version:1.0
 */
@Slf4j
public class NonNullTest {
    public static void main(String[] args) {
        String pwd = null;
        login(pwd);


    }

    public static void login(String pwd) {
        if (pwd == null) {
            log.info("参数为空");
            throw new NullPointerException("NPE异常,参数为空");
        }

        // TODO 业务逻辑
        log.info("密码传入成功");
    }
}

这是我以前写的代码,当一个参数传入进来,我们必须对传入的参数进行非空判断,否则会出现NPE异常。

我们再来看一个代码:

我们在login()方法的参数列表上写@NonNull注解

package com.lzh;

import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh
 * @Project:1024shop-manager
 * @name:NonNullTest
 * @Date:2023/3/29 下午5:05
 * @Filename:NonNullTest
 * @Description@NonNull 注解,作用于方法或者属性,用于非空判断,如果为空则抛出异常!
 * @Version:1.0
 */
@Slf4j
public class NonNullTest {
    public static void main(String[] args) {
        String pwd = null;
        login(pwd);


    }

    public static void login(@NonNull String pwd) {
        // TODO 业务逻辑
        log.info("密码传入成功");
    }
}

当我们对login()方法中的参数传入一个@NonNull注解时,我们会神器的在字节码文件中发现,@NonNull注解做了2件事情 :

  • 添加一个无参构造方法
  • 对login()方法传入的参数进行了非空校验

public static void login(@NonNull String pwd) {
    if (pwd == null) {
        throw new NullPointerException("pwd is marked non-null but is null");
    } else {
        log.info("密码传入成功");
    }
}

image.png

@NoArgsConstructor 注解

在上一篇文章中,我写到如果在类中写@Setter或@Setter注解时会默认在类中显示的声明无参构造方法。

package com.lzh.model;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.model
 * @Project:1024shop-manager
 * @name:User
 * @Date:2023/3/29 下午4:01
 * @Filename:User
 * @Description:User实体类
 * @Version:1.0
 */

@Setter
@Getter
@NoArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
}

mvn compile 后

image.png

其实大家可以看出来,@NoArgsConstructor 注解就是帮助我们在类中显示的声明一个无参的构造方法!!!!

@AllArgsConstructor注解

@AllArgsConstructor注解可以帮助我们在实体类中生成全参的构造方法

package com.lzh.model;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.model
 * @Project:1024shop-manager
 * @name:User
 * @Date:2023/3/29 下午4:01
 * @Filename:User
 * @Description:User实体类
 * @Version:1.0
 */

@Setter
@Getter
@AllArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
}

image.png

@RequiredArgsConstructor 注解

  • final 类型未被初始化的属性,标记了@NonNull属性,会帮助我们自动判断
  • 注意:在使用@RequiredArgsConstructor 注解后,不能使用@NoAragsConstructor注解
package com.lzh.model;

import lombok.*;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.model
 * @Project:1024shop-manager
 * @name:User
 * @Date:2023/3/29 下午4:01
 * @Filename:User
 * @Description:User实体类
 * @Version:1.0
 */

@Setter
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    @NonNull
    private final String adress;
}

image.png

希望这篇文章对你有帮助,我们下期再见。