01.Lombok-Getter、Setter篇

156 阅读5分钟

01.Lombok-Getter、Setter篇

连载文章,大家多多支持。

Lombok如何在idea中安装和使用这里就不多介绍了。

重新学习Lombok是因为,我之前在项目中,也会使用lombok,但是只会使用@Data注解。 对于Lombok高级的知识点儿却一点儿也不知道。

如果你的情况和我一样,欢迎大家订阅Lombok专题。

Lombok是一个后端Java提效神器。

SpringBoot整合Lombok

  1. 我们可以在通过在线站点start.spring.io/ 创建我们的SpringBoot项目。
    • 其实我们在idea中创建springboot项目也是通过这个网站生成压缩包文件然后放到idea编辑器中解压的。
  2. 在pom.xml 中引入lombok的依赖
    • 技巧:一般我都会通过mavne官方仓库找到lombok的依赖 mvnrepository.com/
    • 找到你们公司使用的就可以。一般来说这种lombok基础的东西在公司项目的脚手架里都有。
    • 至于公司允不允许使用lombok还是需要看公司的规定。如果不能使用lombok就只能利用idea快捷键生成setter、getter、构造、toString...等方法了。
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
    <scope>provided</scope>
</dependency>

完整的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lzh</groupId>
    <artifactId>1024shop-manager</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>1024shop-manager</name>
    <description>后端提效练手</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>

    </build>

    <!-- 代码库 -->

</project>

来看一个pojo类 User.java

package com.lzh.model;

import java.util.Date;

/**
 * @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
 */
public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    private String phone;
    private Integer deleted;
    private Date ctreateTime;
    private Date updatetime;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Integer getDeleted() {
        return deleted;
    }

    public void setDeleted(Integer deleted) {
        this.deleted = deleted;
    }

    public Date getCtreateTime() {
        return ctreateTime;
    }

    public void setCtreateTime(Date ctreateTime) {
        this.ctreateTime = ctreateTime;
    }

    public Date getUpdatetime() {
        return updatetime;
    }

    public void setUpdatetime(Date updatetime) {
        this.updatetime = updatetime;
    }
}

我们使用命令编译Java项目,会在项目中生成字节码文件

mvn compile

image.png 我们可以很快找到我们的字节码文件,其实就是我们编写User.java编译成字节码文件的User.class:

image.png

使用Lombok @Setter注解

package com.lzh.model;

import lombok.Setter;

import java.util.Date;

/**
 * @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
 */
public class User {
    @Setter
    private Integer id;
    private String username;
    private String password;
    private String email;
    private String phone;
    private Integer deleted;
    private Date ctreateTime;
    private Date updatetime;
}

我们再次执行编译项目

mvn compile

image.png

从上图可以清晰的看到,我们的User.class 字节码文件只生成了Setter方法, 还有一个无参的构造方法 【这个点儿很多人不知道】!!!

使用Lombok @Getter注解

同理我们id属性上使用@Getter注解,我们在User.class 只能看到id属性的getter方法。

package com.lzh.model;

import lombok.Getter;
import lombok.Setter;

import java.util.Date;

/**
 * @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
 */
public class User {
    @Getter
    private Integer id;
    private String username;
    private String password;
    private String email;
    private String phone;
    private Integer deleted;
    private Date ctreateTime;
    private Date updatetime;
}

image.png

同时使用@Setter和@Getter注解

同时使用@Setter和@Getter注解可以放在

  • 属性
  • 类上

如果放在属性上,只生成对应属性的Setter、Getter方法;如果放在类上可以使 整个User实体类的所有属性都具有Setter、Getter方法。

放在属性上的写法

package com.lzh.model;

import lombok.Getter;
import lombok.Setter;

import java.util.Date;

/**
 * @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
 */
public class User {
    @Setter
    @Getter
    private Integer id;
    private String username;
    private String password;
    private String email;
    private String phone;
    private Integer deleted;
    private Date ctreateTime;
    private Date updatetime;
}

放在类上的写法

package com.lzh.model;

import lombok.Getter;
import lombok.Setter;

import java.util.Date;

/**
 * @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
public class User {

    private Integer id;
    private String username;
    private String password;
    private String email;
    private String phone;
    private Integer deleted;
    private Date ctreateTime;
    private Date updatetime;
}

使用Lobbok修改访问权限控制符的权限

不知道大家有没有疑惑,为什么在成员属性id上加@Setter方法,就可以生成Getter方法了呢,我也疑惑,但是这个不是我们今天要讨论的话题。

我们写一个方法的时候应关注

  • 访问权限修饰符
  • 方法的返回值
  • 方法名
  • 方法的参数列表
  • 方法的业务逻辑

我们通过翻阅@Setter注解的源码,可以发现在生成Setter方法的时候,默认的权限访问控制符是public的。

image.png

我们现在的有一个需求,生成的Setter方法,必须是private修饰的 我们可以这样做:

package com.lzh.model;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;

/**
 * @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
 */

public class User {
    @Setter(AccessLevel.PRIVATE)
    private Integer id;
    private String username;
    private String password;
    private String email;
    private String phone;
    private Integer deleted;
    private Date ctreateTime;
    private Date updatetime;
}

编译后我们可以看到权限访问修饰符的确变为private了。

image.png

使用Lombok定制需要生成的Setter、Getter的属性

这句话的意思是,我们想在User实体类上只有id属性不生成Setter、Getter 但是除了id属性以外的User类中的所有属性都必须生成Setter、Getter 方法。

可以这样写:

package com.lzh.model;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;

/**
 * @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
public class User {
    @Setter(AccessLevel.NONE)
    @Getter(AccessLevel.NONE)
    private Integer id;
    private String username;
    private String password;
    private String email;
    private String phone;
    private Integer deleted;
    private Date ctreateTime;
    private Date updatetime;
}

如果一个User中有一个成员属性是final修饰的,只会生成getter方法

private final String name;

image.png

User类中有静态变量是不会帮我们生成Setter、Getter方法的

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