欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Lombok基本使用

程序员文章站 2022-04-15 18:24:13
一、Lombok是什么官网:https://projectlombok.org/Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully fea...

一、Lombok是什么

官网:https://projectlombok.org/

Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

翻译:Lombok是一种Java 使用工具,可用来帮助开发人员消除 Java中的冗长代码,尤其是对于简单的Java对象(POJO),它通过注解实现这一目的

使用Lombok前:

/**
 * #Description :  用户类
 * #Date: 2020/11/11 00:11
 * @author : tiankun
 */
public class User implements Serializable {
    private Integer id;        
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public User() {
    }

    public User(Integer id, String username, Date birthday, String sex, String address) {
        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    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 Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

使用Lombok后

/**
 * #Description :  用户类
 * #Date: 2020/11/11 00:11
 * @author : tiankun
 */
@Data
public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
}

 

二、Lombok原理

JSR269规范:插件化注解处理API(Pluggable Annotation Processing API)

JDK6 提供的特性,在 Javac 编译期利用注解做一些事情

@Data 源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)    // 源代码级别
public @interface Data {
    String staticConstructor() default "";
}

Lombok基本使用

 

@Data 注解,在我们编译后,它会把Get,Set等方法添加到我们的class文件中

用@Data注解,User编译后的Class文件

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.tk.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public User() {
    }

    public Integer getId() {
        return this.id;
    }

    public String getUsername() {
        return this.username;
    }

    public Date getBirthday() {
        return this.birthday;
    }

    public String getSex() {
        return this.sex;
    }

    public String getAddress() {
        return this.address;
    }

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

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

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof User)) {
            return false;
        } else {
            User other = (User)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                label71: {
                    Object this$id = this.getId();
                    Object other$id = other.getId();
                    if (this$id == null) {
                        if (other$id == null) {
                            break label71;
                        }
                    } else if (this$id.equals(other$id)) {
                        break label71;
                    }

                    return false;
                }

                Object this$username = this.getUsername();
                Object other$username = other.getUsername();
                if (this$username == null) {
                    if (other$username != null) {
                        return false;
                    }
                } else if (!this$username.equals(other$username)) {
                    return false;
                }

                label57: {
                    Object this$birthday = this.getBirthday();
                    Object other$birthday = other.getBirthday();
                    if (this$birthday == null) {
                        if (other$birthday == null) {
                            break label57;
                        }
                    } else if (this$birthday.equals(other$birthday)) {
                        break label57;
                    }

                    return false;
                }

                Object this$sex = this.getSex();
                Object other$sex = other.getSex();
                if (this$sex == null) {
                    if (other$sex != null) {
                        return false;
                    }
                } else if (!this$sex.equals(other$sex)) {
                    return false;
                }

                Object this$address = this.getAddress();
                Object other$address = other.getAddress();
                if (this$address == null) {
                    if (other$address == null) {
                        return true;
                    }
                } else if (this$address.equals(other$address)) {
                    return true;
                }

                return false;
            }
        }
    }

    protected boolean canEqual(Object other) {
        return other instanceof User;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $id = this.getId();
        int result = result * 59 + ($id == null ? 43 : $id.hashCode());
        Object $username = this.getUsername();
        result = result * 59 + ($username == null ? 43 : $username.hashCode());
        Object $birthday = this.getBirthday();
        result = result * 59 + ($birthday == null ? 43 : $birthday.hashCode());
        Object $sex = this.getSex();
        result = result * 59 + ($sex == null ? 43 : $sex.hashCode());
        Object $address = this.getAddress();
        result = result * 59 + ($address == null ? 43 : $address.hashCode());
        return result;
    }

    public String toString() {
        return "User(id=" + this.getId() + ", username=" + this.getUsername() + ", birthday=" + this.getBirthday() + ", sex=" + this.getSex() + ", address=" + this.getAddress() + ")";
    }
}

 

三、安装

 

1、导入jar包 / 资源

安装lombok插件的前提就是需要下载lombok,jar。

官网下载jar包

当然也如果是Maven项目直接可以在maven中导入,版本随你意,我使用的就是maven

<!-- lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

2、安装lombok插件

2.1 Eclipse

在下载完lombok.jar。右键点击。打开方式选择——》java(TM) Platform  SE binary 

Lombok基本使用

 

Lombok基本使用

 

’插件安装成功,然后把你的lombok.jar导入到你项目中去(如果没有安装插件,则使用lombok,jar包中的注解不起作用)

 

2.2 IDEA

直接在 Setting-> Plugins 里面搜索 lombok下载 重启即可

Lombok基本使用

 

四、Lombok的常用注解

Lombok基本使用

 

1、Getter、Setter

①、字段上:对该字段进行操作

②、类上:对类中所有的字段进行操作

public class User implements Serializable {
    @Setter()
    @Getter(AccessLevel.PRIVATE)     //指定修饰符    默认是 AccessLevel.PUBLIC
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
}

Lombok基本使用

 

特殊情况:

1、如果字段是被 static修饰的,则不会生成该字段的 Getter、Setter方法

2、如果字段是被finnal 修饰的,则只会生成 Get方法 不会生成 Set 方法

Lombok基本使用

Lombok基本使用

 

如果我们不想某个字段被生成Getter,Setter方法,可以使用参数: AccessLevel.NONE 来设置

Lombok基本使用

Lombok基本使用

 

2、ToString

static修饰的变量 不会被打印输出, final修饰的的变量可以被打印输出

  • of    只打印 {} 中的字段
  • exclude      打印除了 { } 中的所有字段
@Getter
@Setter
@ToString(of = {"id"})
//@ToString(exclude = {"name"})
public class User implements Serializable {
    static String  s = "";
    final String ss = "";
    private Integer id;
    private String name;


    public static void main(String[] args) {
        User user = new User();
        user.setId(18);
        user.setName("田坤");
        System.out.println(user);
    }
}
User(id=18)

Lombok基本使用

 

3、EqualsAndHashCode

帮我们生成 hashCodo 和 equals 方法

  • of    只操作 {} 中的字段
  • exclude      操作除了 { } 中的所有字段

lombok帮我们生成的 equals 和 hashCode方法

 public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof User)) {
            return false;
        } else {
            User other = (User)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                label47: {
                    Object this$ss = this.getSs();
                    Object other$ss = other.getSs();
                    if (this$ss == null) {
                        if (other$ss == null) {
                            break label47;
                        }
                    } else if (this$ss.equals(other$ss)) {
                        break label47;
                    }

                    return false;
                }

                Object this$id = this.getId();
                Object other$id = other.getId();
                if (this$id == null) {
                    if (other$id != null) {
                        return false;
                    }
                } else if (!this$id.equals(other$id)) {
                    return false;
                }

                Object this$name = this.getName();
                Object other$name = other.getName();
                if (this$name == null) {
                    if (other$name != null) {
                        return false;
                    }
                } else if (!this$name.equals(other$name)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(Object other) {
        return other instanceof User;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $ss = this.getSs();
        int result = result * 59 + ($ss == null ? 43 : $ss.hashCode());
        Object $id = this.getId();
        result = result * 59 + ($id == null ? 43 : $id.hashCode());
        Object $name = this.getName();
        result = result * 59 + ($name == null ? 43 : $name.hashCode());
        return result;
    }

 

4、NonNull

NonNull 表示修饰的变量不能为空,如果为空则会抛出一个异常

    @NonNull
    private String name;

    public void test(@NonNull String str){

    }

编译后 lombok 在class文件中帮我们做的事:

    public void setName(@NonNull String name) {
        if (name == null) {
            throw new NullPointerException("name is marked non-null but is null");
        } else {
            this.name = name;
        }
    }    
    
    public void test(@NonNull String str) {
        if (str == null) {
            throw new NullPointerException("str is marked non-null but is null");
        }
    }
 

5、Constructor

  • @NoArgsConstructor           生成无参的构造函数
  • @RequiredArgsConstructor     生成部分参数的构造函数
    • 只识别 @NonNull 修饰的字段 和 没有初始值的 final 修饰的字段
  • @AllArgsConstructor            生成全参的构造函数
@RequiredArgsConstructor
public class User implements Serializable {
    static String  s = "";
    final String ss;
    private Integer id;
    @NonNull private String name;
}

编译后的class文件

    public User(String ss, @NonNull String name) {
        if (name == null) {
            throw new NullPointerException("name is marked non-null but is null");
        } else {
            this.ss = ss;
            this.name = name;
        }
    }

 

6、Data

     集四个职责于一身

  • Getter、Setter
  • ToString
  • EqualsAndHashCode
  • RequiredArgsConstructor

 

7、Builder

可以使用 链式编程 来传入参数和调用方法

Lombok基本使用

@Builder
@ToString
public class User implements Serializable {
    static String  s = "";
    final String ss;
    private Integer id;
    private String name;
}

class Test{
    public static void main(String[] args) {
        User user = User.builder().id(11).name("田坤").build();
        System.out.println(user);
    }
}

 

8、Log 启用日志

https://www.jianshu.com/p/42b1bcb994a8

9、Val  (@Value)

一个未定义的类型

    val map = new HashMap<String,String>();

 

10、Clearup

自动关闭一些资源

public void demo(){
        //创建源
        System.out.println();
        File srcFile = new File("D:/WorkSpace/IdeaWorksSpace/javabase/IO/src/part2/ave1.jpg");
        File destFile = new File("D:/WorkSpace/IdeaWorksSpace/javabase/IO/src/part2/ave1Copy.jpg");
        //选择流
        @Cleanup InputStream is = null;
        @Cleanup OutputStream os = null;
        //操作
        try {
            is = new FileInputStream(srcFile);
            os = new FileOutputStream(destFile);
            //缓存容器
            byte[] flush = new byte[1024];
            int len = -1;
            while ((len = is.read(flush))!= -1){
                os.write(flush,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

@Cleanup 最后会帮我们关闭 InputStream 和 OutputStream ,他也是在编译后在 finally里面 关闭资源;

 

 

 

 

 

 

 

 

 

 

 

 

本文地址:https://blog.csdn.net/qq_41965731/article/details/109614145

相关标签: Java高级框架