首页 > 其他分享 >lombok 详解

lombok 详解

时间:2022-10-21 01:11:30浏览次数:48  
标签:return name age 详解 Student lombok public

简述

  lombok可以通过注解的方式,帮我们简化java类中诸如Getter,Setter,ToString等臃肿但是又必须的方法书写。

Lombok依赖

  https://mvnrepository.com/artifact/org.projectlombok/lombok

  这里使用lombok的1.18.22版本

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.22'
}

  注意如果gradle版本在5.0以上会构建失败,正确的姿势应该是:

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.22'
    annotationProcessor 'org.projectlombok:lombok:1.18.22'
    testCompileOnly 'org.projectlombok:lombok:1.18.22'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
}

  原因详见https://cloud.tencent.com/developer/article/1480194

IDEA的lombok插件

  Intellij IDEA 2020.3之后 Lombok 已经成为内置插件,不需要自行安装

  以前版本可以在插件市场进行安装

  在idea设置栏选中启用Annotation Processors

Lombok注解

  常用注解

@Data 最常用的注解,注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor
@Setter 作用于属性上,为该属性提供setter方法; 作用与类上,为该类所有的属性提供setter方法
@Getter 作用和Setter相似,生成Getter方法
@AllArgsConstructor 作用于类上,为该类提供一个包含全部参的构造方法,注意此时默认构造方法不会提供。
@NoArgsConstructor 作用于类上,提供一个无参的构造方法。可以和@AllArgsConstructor同时使用,此时会生成两个构造方法:无参构造方法和全参构造方法。
@NonNull 作用于属性上,提供关于此参数的非空检查,如果参数为空,则抛出空指针异常。
@Log4j 作用于类上,为该类提供一个属性名为log的log4j日志对象。

@Data

  例如我在一个java上添置了@Data注解

package com.hjj;
import lombok.Data;

@Data
public class Student {
    private String name;
    private Integer age;
}

  编译后可以看到生成了setter/getter、equals、canEqual、hashCode、toString方法

  注意@Data注解没有生成带参构造函数,如果需要生成要用@AllArgsConstructor注解

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

package com.hjj;

public class Student {
    private String name;
    private Integer age;

    public Student() {
    }

    public String getName() {
        return this.name;
    }

    public Integer getAge() {
        return this.age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Student)) {
            return false;
        } else {
            Student other = (Student)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                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;
                }

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

                return true;
            }
        }
    }

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

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

    public String toString() {
        String var10000 = this.getName();
        return "Student(name=" + var10000 + ", age=" + this.getAge() + ")";
    }
}
Student类编译后

@NonNull

  非常好用,在参数上使用后,构造函数中如果传入null给此参数会报错

  例如我在Student类的name参数加了@NonNull

package com.hjj;

import lombok.Data;
import lombok.NonNull;

@Data
public class Student {
    @NonNull
    private String name;
    private Integer age;
}

  编译后的构造函数则为

public Student(@NonNull String name) {
    if (name == null) {
        throw new NullPointerException("name is marked @NonNull but is null");
    } else {
        this.name = name;
    }
}

  可以看到name参数做了判空处理

@Log4j

  使用此注解需同样引入slf4j的依赖

  @Log4j注解会生成一个log常量供我们使用

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data
@Slf4j
public class Student {
    private String name;
    private Integer age;
}

  生成的代码为

public class Student {
  private static final Logger log = LoggerFactory.getLogger(Student.class);
  ...
}

References

  https://cloud.tencent.com/developer/article/1480194

  https://blog.csdn.net/ThinkWon/article/details/101392808

  https://blog.csdn.net/cauchy6317/article/details/102567195

标签:return,name,age,详解,Student,lombok,public
From: https://www.cnblogs.com/CNLayton/p/16812128.html

相关文章

  • Java基础(九)| ArrayList详解与应用
    ⭐本专栏旨在对JAVA的基础语法及知识点进行全面且详细的讲解,完成从0到1的java学习,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握JAVA编程,同时为后续的框架学习,进阶开......
  • 封装详解
    封装如何封装定义属性时,定义为私有的:publicclassStudent{privateStringname;privateintage;} 我们使用get、set方法设置属性:publicclassS......
  • 【Python基础学习】第六节 time模块 & datetime模块详解
    Python基础学习之时间模块time模块datetime模块Python中,关于时间的模块,常用为:time&datetime两个模块;时间相关的模块虽然内容挺多,但是并不需要死记硬背,只要留个印象就......
  • JDBC各个详解-ResultSet基本使用以及遍历结果集
    JDBC各个详解-ResultSet基本使用ResultSet:结果集对象,封装查询结果next():游标向下移动一行getxxx():获取数据xxx:代表数据类型如:intgetInt() String......
  • C语言中字符串详解
    C语言中字符串详解字符串时是C语言中非常重要的部分,我们从字符串的性质和字符串的创建、程序中字符串的输入输出和字符串的操作来对字符串进行详细的解析。什么是字符......
  • OO ALV 详解
    创建用户对话屏幕,在屏幕上绘制一个用户自定义控件区域,然后以此基础来创建 cl_gui_custom_container容器实例,最后以此容器实例来创建cl_gui_alv_grid实例,调用其实例方法se......
  • JDBC练习_delete、DDL语句和JDBC各个类详解_ResultSet_基本使用
    JDBC练习_delete、DDL语句:delete语句:删除一条记录1.练习:account表 删除一条记录publicstaticvoidmain(String[]args){//设sta为空Statement......
  • Linux笔记-top命令信息详解
    目录参考资料top命令详解使用/proc/self/status注入代码监控某段代码执行前后进程内存状态参考资料https://segmentfault.com/a/1190000013504502https://blog.csdn.net......
  • 日志管理工具 - journalctl使用详解
    说明:  CentOS7以后版,利用Systemd统一管理所有Unit的启动日志。可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。journalctl配置文件:/etc/systemd/jo......
  • JDBC各个类详解-Statement以及JDBC练习-insert语句
    JDBC各个类详解-Statement执行sql1.booleanexecute(Stringsql):可以执行任意sql语句,了解2.intexecuteUpdate(Stringsql):执行DML(insertupdatedelete)语句,D......