返回顶部
首页 > 资讯 > 精选 >Java库lombok及注解如何使用
  • 920
分享到

Java库lombok及注解如何使用

2023-07-02 18:07:55 920人浏览 薄情痞子
摘要

本篇内容介绍了“Java库lombok及注解如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lombok是什么Lombok是一个旨在减

本篇内容介绍了“Java库lombok及注解如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Lombok是什么

Lombok是一个旨在减少代码开发工作的Java库。它提供了一些简单的注解,并以此来消除java中臃肿的模版代码,比如 pojo 中最常见的 setter/getter 方法, 比如 toString 方法, 比如 equals 方法等等,还可以帮助我们关闭流,即使 jdk7 中已经有了 TWR 特性,但这个包很值得一试。

通过几个简单的注解,将模版代码在编译时写入程序。使用 eclipse 可以在 Outline 窗口看到生成的方法,但是在源码里是干净的.

安装

首先去 lombok 官网下载jar 包。

只是把 jar 包下载下来并导入工程中,会发现 IDE 不识别它的注解,那怎么办?

对于eclipse

将 lombok.jar 复制到 eclipse.ini 所在的目录下,然后编辑 eclipse.ini 文件, 在它的末尾插入以下两行并保存:

Xbootclasspath/a:lombok.jarjavaagent:lombok.jar

接着重启 eclipse 就可以愉快地使用这个库了。

对于 idea

在 IntelliJ 的插件中心可以找到它。

QuickStart

Lombok 提供的注解不多,但都好用,简要说一下常用的几个。

@Setter/@Getter

这两个注解修饰成员变量,可用于生成 setter/gettter 模版代码。
举个栗子:

import lombok.AccessLevel;import lombok.Getter;import lombok.Setter;public class Student {    @Setter @Getter private String name;    @Getter(AccessLevel.PROTECTED) private int age;// 可以指定访问权限    @Setter @Getter private String[] hobbies;}

将字节码文件反编译后可以看到下面这段代码

public class Student {  private String name;  private int age;  private String[] hobbies;  public String getName() { return this.name; }   public void setName(String name) { this.name = name; }  protected int getAge() { return this.age; }  public String[] getHobbies() { return this.hobbies; }   public void setHobbies(String[] hobbies) { this.hobbies = hobbies; }}

@ToString

import lombok.ToString;@ToString(exclude="id")public class ToStringExample {    private int id;    private String name;    private String[] tags;}

编译后

import java.util.Arrays;public class ToStringExample {  public String toString() {     return "ToStringExample(name=" + this.name + ", tags=" + Arrays.deepToString(this.tags) + ")";   }  private int id;  private String name;  private String[] tags;}

我们发现,对于数组,在写 toString 方法时使用了 Arrays类的 静态方法 deepToString

来看 eclipse 自动生成的 toString 方法:

@Overridepublic String toString() {    return "ToStringExample [name=" + name + ", tags=" + Arrays.toString(tags) + "]";}

eclipse 中对于数组采用的是 Arrays.toString()

区别:这两个方法的区别是这样的,对于多维数组,使用 toString 只能打印出内部数组的名字,这时需要使用 deepToString 方法,它能将内部数组的内容全部打印出来。

exclude 参数

可以指定哪些属性不出现在 toString 方法中, 比如 exclude={"id", "name"}

doNotUseGetters 参数

当类中有成员变量的 getter 方法时,生成 toString 方法会使用这些 getter 方法,比如

public String toString() {     return "ToStringExample(name=" + getName() + ", tags=" + Arrays.deepToString(getTags()) + ")"; }

但是将该参数设置为 true 时(默认为 false),生成 toString 方法时就不会使用 getter 方法,而是直接使用这些成员变量,比如

public String toString() {     return "ToStringExample(name=" + this.name + ", tags=" + Arrays.deepToString(this.tags) + ")"; }

includeFieldNames参数

原本是以 fieldName = fieldValue 的格式来生成 toString 方法的,但是将该参数设置为 false 后(默认是 true),就不会显示 fieldName 了,而只是生成 fieldValue, 比如

public String toString() {   return "ToStringExample(" + getId() + ", " + getName() + ", " + Arrays.deepToString(getTags()) + ")"; }

callSuper 参数

若类 A 是类 B 的子类,那么在 A 类重写 toString 时,若把该参数设置为 true,会加入下面这段代码,即也会把父类 B 的 toString 也写入。

super=" + super.toString()

@NonNull

检查传入对象是否为 Null,若为null,则抛出NullPointerException异常。
举个栗子

import lombok.NonNull;public class NonNullExample extends Student{    private String name;    public NonNullExample(@NonNull Student student) {        this.name = student.getName();    }}

编译后代码

import lombok.NonNull;public class NonNullExample extends Student {     private String name;    public NonNullExample(@NonNull Student student) {         if (student == null)             throw new NullPointerException("student");        this.name = student.getName();  }}

@EqualsAndHashCode

用在类上,用于生成 equals 和 hashcode 方法。
举个栗子

@EqualsAndHashCode(exclude={"id"})public class EqualsAndHashCodeExample {     private transient int transientVar = 10;     private String name;     private double score;     private String[] tags;     private int id;}

编译后代码

import java.util.Arrays;public class EqualsAndHashCodeExample {     public int hashCode() {         int PRIME = 59;        int result = 1;        Object $name = this.name;        result = result * 59 + ($name == null ? 43 : $name.hashCode());        long $score = Double.doubleToLongBits(this.score);        result = result * 59 + (int)($score ^ $score >>> 32);        result = result * 59 + Arrays.deepHashCode(this.tags);        return result;     }     protected boolean canEqual(Object other) {         return other instanceof EqualsAndHashCodeExample;     }     public boolean equals(Object o) {         if (o == this)  return true;         if (!(o instanceof EqualsAndHashCodeExample)) return false;         EqualsAndHashCodeExample other = (EqualsAndHashCodeExample)o;         if (!other.canEqual(this)) return false;         Object this$name = this.name;        Object other$name = other.name;         if (this$name == null ? other$name != null : !this$name.equals(other$name))             return false;         if (Double.compare(this.score, other.score) != 0)             return false;         return Arrays.deepEquals(this.tags, other.tags);    }private transient int transientVar = 10;private String name;private double score;private String[] tags;private int id;}

可以看出transient修饰的变量,不会参与。

参数

参数 of 用来指定参与的变量,其他的跟 @ToString 注解类似。

@Data

该注解用于修饰类,会自动生成getter/setter方法, 以及重写equals()hashcode()toString()方法。

@Cleanup

该注解可以用来自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源, 自动生成try­finally这样的代码来关闭流

举个栗子:

import lombok.Cleanup;import java.io.*;public class CleanupExample {  public static void main(String[] args) throws IOException {    @Cleanup InputStream in = new FileInputStream(args[0]);      @Cleanup OutputStream out = new FileOutputStream(args[1]);        byte[] b = new byte[10000];        while (true) {        int r = in.read(b);        if (r == -1) break;        out.write(b, 0, r);       }     }}

@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor

这三个注解修饰在类上。

@NoArgsConstructor 用于生成一个无参构造方法。

@RequiredArgsConstructor 会生成一个包含了被@NotNull标识的变量的构造方法。同样可以设置生成构造方法的权限,使用 access参数进行设置。

@AllArgsConstructor 会生成一个包含所有变量, 同时如果变量使用了@NotNull,会进行是否为空的校验。

举个栗子:

import lombok.*;@RequiredArgsConstructor(staticName = "of")@AllArgsConstructor(access = AccessLevel.PROTECTED)public class ConstructorExample {    private int x;    private int y;    @NonNull private String desc;    @NoArgsConstructor    public class NoArgsExample{        private String field;    }}

这与下面这段代码是等价的,

import java.beans.ConstructorProperties;public class ConstructorExample {     public static ConstructorExample of(@lombok.NonNull String desc) {         return new ConstructorExample(desc);     }     private ConstructorExample(@lombok.NonNull String desc) {        if (desc == null) throw new NullPointerException("desc");         this.desc = desc;     }     @ConstructorProperties({"x", "y", "desc"})    protected ConstructorExample(int x, int y, @lombok.NonNull String desc) {        if (desc == null) throw new NullPointerException("desc");         this.x = x;        this.y = y;        this.desc = desc;    }    private int x;    private int y;    @lombok.NonNull    private String desc;    public class NoArgsExample    {        private String field;        public NoArgsExample() {}    }}

@Value

该注解用于修饰类,是@Data的不可变形式, 相当于为成员变量添加final声明, 只提供getter方法, 而不提供setter方法,然后还有 equals/hashCode/toString方法,以及一个包含所有参数的构造方法。

@builder

用在类、构造器、方法上,为你提供复杂的builder apis,让你可以像如下方式调用

Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build()

举个栗子:

import lombok.Builder;import java.util.Set;@Builderpublic class BuilderExample {    private String name;    private int age;}

反编译代码如下:

package tutorial.lombok;    public class BuilderExample    {        public static class BuilderExampleBuilder        {            private String name;            private int age;            public BuilderExampleBuilder name(String name)            {                this.name = name;                return this;            }            public BuilderExampleBuilder age(int age)            {                this.age = age;                return this;            }            public BuilderExample build()            {                return new BuilderExample(name, age);            }            public String toString()            {                return (new StringBuilder()).append("BuilderExample.BuilderExampleBuilder(name=").append(name).append(", age=").append(age).append(")").toString();            }            BuilderExampleBuilder()            {            }        }        private String name;        private int age;        BuilderExample(String name, int age)        {            this.name = name;            this.age = age;        }        public static BuilderExampleBuilder builder()        {            return new BuilderExampleBuilder();        }    }

注意:

使用@Singular注解的集合属性名必须使用s结尾, lombok会将属性名结尾的s去掉,剩余的名字会作为方法名, 向这个集合中添加元素。

@Builder 的参数builderClassName设置生成的builder方法名,buildMethodName 设置build方法名,builderMethodName设置builderMethod`方法名。
比如

@Builder(builderClassName = "GBuilder", buildMethodName = "buildG", builderMethodName = "GBuilder"

@SneakyThrows

自动抛受检异常, 而无需显式在方法上使用throws语句。

@Synchronized

用在方法上,将方法声明为同步的,并自动加,而锁对象是一个私有的属性 LOCK,而java中的synchronized关键字锁对象是this,锁在this或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁this或者类对象,这可能会导致竞争条件或者其它线程错误。

举个栗子:

import lombok. Synchronized;public class SynchronizedExample {    private final Object readLock = new Object() ;    @Synchronized    public static void hello() {        System. out. println("world") ;    }    @Synchronized("readLock")    public void foo() {        System. out. println("bar") ;    }}

反编译代码如下:

public class SynchronizedExample {    private static final Object $LOCK = new Object[0] ;    private final Object readLock = new Object() ;    public static void hello() {        synchronized($LOCK) {            System. out. println("world") ;        }    }    public int answerToLife() {        synchronized($lock) {            return 42;        }    }    public void foo() {        synchronized(readLock) {            System. out. println("bar") ;        }    }}

@Getter(lazy=true)

可以替代经典的Double Check Lock样板代码。

举个栗子:

import lombok.Getter;public class GetterLazyExample {    @Getter(lazy=true) private final double[] cached = expensive();    private double[] expensive() {        double[] result = new double[1000000];        for (int i = 0; i < result.length; i++) {            result[i] = Math.asin(i);        }        return result;    }}

反编译代码如下,

import java.util.concurrent.atomic.AtomicReference;public class GetterLazyExample{    private final AtomicReference cached = new AtomicReference();    public GetterLazyExample()    {    }    private double[] expensive()    {            double result[] = new double[0xf4240];        for (int i = 0; i < result.length; i++)            result[i] = Math.asin(i);        return result;    }    public double[] getCached()    {        Object value = cached.get();        if (value == null)            synchronized (cached)            {                value = cached.get();                if (value == null)                {                    double actualValue[] = expensive();                    value = actualValue != null ? ((Object) (actualValue)) : ((Object) (cached));                    cached.set(value);                }            }        return (double[])(double[])(value != cached ? value : null);    }}

@Log

根据不同的注解生成不同类型的log对象, 但是实例名称都是log, 有六种可选实现类

@CommonsLoGCreates log = org. apache. commons. logging. LogFactory. getLog(LogExample. class) ;@LogCreates log = java. util. logging. Logger. getLogger(LogExample. class. getName() ) ;@Log4jCreates log = org. apache. log4j. Logger. getLogger(LogExample. class) ;@Log4j2Creates log = org. apache. logging. log4j. LogManager. getLogger(LogExample. class) ;@Slf4jCreates log = org. slf4j. LoggerFactory. getLogger(LogExample. class) ;@XSlf4jCreates log = org. slf4j. ext. XLoggerFactory. getXLogger(LogExample. class) ;

举个栗子,

import lombok.extern.java.Log;import lombok.extern.slf4j.Slf4j;@Logpublic class LogExample {    public static void main(String... args) {        log.error("Something's wrong here");    }}@Slf4jpublic class LogExampleOther {    public static void main(String... args) {        log.error("Something else is wrong here");    }}@CommonsLog(topic="CounterLog")public class LogExampleCateGory {    public static void main(String... args) {        log.error("Calling the 'CounterLog' with a message");    }}
@CommonsLog(topic="CounterLog")

这条语句会翻译成这样

private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog("CounterLog");

“Java库lombok及注解如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Java库lombok及注解如何使用

本文链接: https://lsjlt.com/news/343687.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java库lombok及注解如何使用
    本篇内容介绍了“Java库lombok及注解如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lombok是什么Lombok是一个旨在减...
    99+
    2023-07-02
  • Lombok中@EqualsAndHashCode注解如何使用
    这篇文章主要介绍“Lombok中@EqualsAndHashCode注解如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Lombok中@EqualsAndHashCode注解如何使用”文章能帮...
    99+
    2023-07-05
  • Lombok中@EqualsAndHashCode注解的使用及说明
    目录@EqualsAndHashCode注解先来看问题1、定义一个基础类Car2、定义一个扩展类BYD继承Car3、分别new两个对象并比较4、查看比较结果解决办法总结@Equals...
    99+
    2023-03-06
    Lombok @EqualsAndHashCode @EqualsAndHashCode注解 @EqualsAndHashCode注解使用
  • 减少代码开发工作的Java库lombok及注解的使用学习
    目录前言Lombok是什么安装对于eclipse对于 IDEAQuickStart@Setter/@Getter@ToStringexclude 参数doNotUseGetters ...
    99+
    2024-04-02
  • Java的Lombok如何使用
    本篇内容主要讲解“Java的Lombok如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的Lombok如何使用”吧!1)引入相应的maven包:<dependency>...
    99+
    2023-06-16
  • Lombok注解-@SneakyThrows的使用
    目录Lombok注解@SneakyThrows原理lombok注解@SneakyThrows探索及与try catch、throws Exception区别导入 Maven方法测试L...
    99+
    2024-04-02
  • Java中Lombok常用注解分享
    目录Our-task介绍安装Lombok加入Maven依赖IDEA中安装Lombok插件注解介绍@Getter和@Setter@ToString@EqualsAndHashCode@...
    99+
    2023-05-17
    Java Lombok常用注解 Java Lombok注解 Java Lombok
  • java中Lombok的注解怎么用
    这篇文章主要讲解了“java中Lombok的注解怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中Lombok的注解怎么用”吧!注解举例@ToString:实现toString(...
    99+
    2023-06-30
  • lombok注解不起作用如何解决
    如果Lombok注解不起作用,可能有以下几种解决方法: 确认是否安装了Lombok插件:在使用Lombok注解之前,确保已经安装...
    99+
    2023-10-28
    lombok
  • Lombok如何使用
    这篇文章主要讲解了“Lombok如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Lombok如何使用”吧! 简单的说,Lombok就是给你的主力机配...
    99+
    2024-04-02
  • 如何在Java项目中使用Lombok
    本文章向大家介绍如何在Java项目中使用Lombok的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许...
    99+
    2023-06-06
  • Java的Lombok如何安装与使用
    这篇文章主要介绍了Java的Lombok如何安装与使用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。安装Lombok的安装分两部分:Idea插件的安装和maven中pom文件...
    99+
    2023-06-29
  • IDEA 安装lombok及使用详解
    目录 ① 为什么使用 ② 如何安装 1.安装lombok插件:    2.添加lombok的maven的pom.xml依赖:   3.实体类示例代码Student.java 4.测试类LombokTest.java    5. 输出结果: ...
    99+
    2023-09-02
    intellij-idea java ide
  • Java中Lombok的使用详解
    这篇文章主要介绍“Java中Lombok的使用详解”,在日常操作中,相信很多人在Java中Lombok的使用详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中Lombok的使用详解”的疑惑有所帮助!...
    99+
    2023-06-16
  • 如何解决Lombok注解不起作用的问题
    本篇内容介绍了“如何解决Lombok注解不起作用的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lombok注解不起作用场景:减少实体类...
    99+
    2023-06-20
  • Springboot中使用lombok的@Data注解方式
    目录Springboot 使用lombok的@Data注解idea安装lombok插件创建项目,编写实体类编写测试类测试结果springBoot 注解@Data注入失败一、Files--Seetings--Plugins二、如果重启后仍注入...
    99+
    2014-06-11
    Springboot注解 lombok 注解 @Data注解
  • 聊聊Lombok中的@Builder注解使用教程
    目录Lombok中的@Builder注解的使用作用引入依赖第二步给实体类加上@Builder注解第三步使用测试使用@Builder注解生成对象实体类加上@Builder注解之后的编译...
    99+
    2024-04-02
  • Lombok在idea中如何使用
    这篇文章主要讲解了“Lombok在idea中如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Lombok在idea中如何使用”吧!一、什么是lombok  &nbs...
    99+
    2023-07-05
  • 如何解决Java中Lombok @Value注解导致的variable not been initialized问题
    本篇内容介绍了“如何解决Java中Lombok @Value注解导致的variable not been initialized问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
    99+
    2023-06-20
  • Java中如何使用Spring注解
    Java中如何使用Spring注解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Spring4之后,要使用注解开发,必须要保证aop的包导入了使用注解需要导入contex...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作