专栏首页测试基础【SpringBoot-3】Lombok使用详解

【SpringBoot-3】Lombok使用详解

Lombok使用详解 在以往的Java编程中,每当创建一个对象类后,我们都要手动写Getter/Setter、构造器方法、字符串输出的ToString方法和Equals/HashCode方法等,非常繁琐,代码可读性也很差。现在,我给大家推荐一款高效插件–lombok,让编程变得更加高效快捷。

Lombok简介

Lombak是一款Java开发插件,它主要应用在Java模型对象类中。 Lomabk通过注解的方式,隐式(即代码中不可见,但编译后可见)实现Getter/Setter、构造器方法、字符串输出的ToString方法和Equals/HashCode方法等,大幅度精简冗长繁琐的代码。 Lombok针对这些内容的处理是在编译期,而不是通过反射机制,这样的好处是并不会降低系统的性能。

lombok的官方地址:https://projectlombok.org/ lombok的Github地址:https://github.com/rzwitserloot/lombok lombok的maven地址:https://mvnrepository.com/artifact/org.projectlombok/lombok

Lombok安装

Lombok的安装分两部分:Idea插件的安装和maven中pom文件的导入。 第一步,在IDEA中安装插件:File–Settings…–搜索plugins–搜索lombok,点击INSTALL即可。

第二步,引入pom中依赖:

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

Lombak使用

@Data

@Data最常用的注解之一。注解在类上,提供该类所有属性的getter/setter方法,还提供了equals、canEqual、hashCode、toString方法。 效果如何,请看下面示例。

@Data
public class Demo {
    private int id;
    private String name;
}

上面一段非常简洁的代码,编译后是什么样子呢?

public class Demo {
    private int id;
    private String name;

    public Demo() {
    }

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

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

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

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

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

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

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        int result = result * 59 + this.getId();
        Object $remark = this.getRemark();
        result = result * 59 + ($remark == null ? 43 : $remark.hashCode());
        return result;
    }

    public String toString() {
        return "Demo(id=" + this.getId() + ", remark=" + this.getRemark() + ")";
    }
}

可见,lombak的@Data注解给对象类提供了默认的构造方法、属性的getter/setter方法、equals、canEqual、hashCode、toString方法。 更方便的是,当新增属性或减少属性时,直接删除属性定义即可,效率是否提升了很多?

@Setter&@Getter

@Setter和@Getter都能提供默认的构造方法,根据注解的位置,作用有所不同,以@Setter为例。

作用于属性上,为该属性提供setter方法:

public class Demo {
  private int id;
  @Setter
  private String name;
}

作用于类上,为该类所有的属性提供setter方法:

@Setter
public class Demo {
    private int id;
    private String name;
}

@Getter与@Setter同理,两者也可以同时使用。

@Builder

@Builder注释为你的类生成相对略微复杂的构建器API。@Builder可以让你以下面显示的那样调用你的代码,来初始化你的实例对象:

import lombok.Builder;

@Builder
public class Demo {
    private int id;
    private String name;
}

class Test {
    public void test() {
        Demo.builder().id(1).name("xiaoming").build();
    }
}

@NonNull

作用于属性上,提供关于此参数的非空检查,如果参数为空,则抛出空指针异常。下面做一个对比。

使用lombok:

import lombok.NonNull;

public class NonNullExample extends Something {
    private String name;  
    public NonNullExample(@NonNull Person person) {
    super("Hello");
    this.name = person.getName();
}

不使用lombok:

public class NonNullExample extends Something {
    private String name; 
    public NonNullExample(@NonNull Person person) {
        super("Hello");
        if (person == null) {
            throw new NullPointerException("person");
        }
        this.name = person.getName();
    }
}

@Log4j

作用于类上,为该类提供一个属性名为log的log4j日志对象。

@Log4j
public class Demo {
}

该属性一般使用于Controller、Service等业务处理类上。与此注解相同的还有@Log4j2,顾名思义,针对Log4j2。

@AllArgsConstructor

作用于类上,为该类提供一个包含全部参的构造方法,注意此时默认构造方法不会提供。

@AllArgsConstructor
public class Demo {
    private int id;
    private String name;
}

效果如下:

public class Demo {
    private int id;
    private String name;

    public Demo(final int id, final String name) {
        this.id = id;
        this.name = name;
    }
}

@NoArgsConstructor

作用于类上,提供一个无参的构造方法。可以和@AllArgsConstructor同时使用,此时会生成两个构造方法:无参构造方法和全参构造方法。

@EqualsAndHashCode

作用于类上,生成equals、canEqual、hashCode方法。具体效果参看最开始的@Data效果。

@RequiredArgsConstructor

作用于类上,由类中所有带有@NonNull注解或者带有final修饰的成员变量作为参数生成构造方法。

@Cleanup

作用于变量,保证该变量代表的资源会被自动关闭,默认调用资源的close()方法,如果该资源有其它关闭方法,可使用@Cleanup(“methodName”)来指定。

public void jedisExample(String[] args) {
    try {
        @Cleanup Jedis jedis = redisService.getJedis();
    } catch (Exception ex) {
        logger.error(“Jedis异常:”,ex)
    }
}

效果相当于:

public void jedisExample(String[] args) {

    Jedis jedis= null;
    try {
        jedis = redisService.getJedis();
    } catch (Exception e) {
        logger.error(“Jedis异常:”,ex)
    } finally {
        if (jedis != null) {
            try {
                jedis.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

@ToString

作用于类上,生成包含所有参数的toString方法。见@Data中toString方法。

@Value

作用于类上,会生成全参数的构造方法、getter方法、equals、hashCode、toString方法。与@Data相比多了全参构造方法,少了默认构造方法、setter方法和canEqual方法。

该注解需要注意的是:会将字段添加上final修饰,个人感觉此处有些失控,不太建议使用。

@SneakyThrows

作用于方法上,相当于把方法内的代码添加了一个try-catch处理,捕获异常catch中用Lombok.sneakyThrow(e)抛出异常。使用@SneakyThrows(BizException.class)指定抛出具体异常。

@SneakyThrows
public int getValue(){
    int a = 1;
    int b = 0;
    return a/b;
}

效果如下:

public int getValue() {
    try {
        int a = 1;
        int b = 0;
        return a / b;
    } catch (Throwable var3) {
        throw var3;
    }
}

@Synchronized

作用于类方法或实例方法上,效果与synchronized相同。区别在于锁对象不同,对于类方法和实例方法,synchronized关键字的锁对象分别是类的class对象和this对象,而@Synchronized的锁对象分别是私有静态final对象lock和私有final对象lock。也可以指定锁对象。

public class FooExample {

    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 FooExample {

    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 void foo() {
        synchronized (readLock) {
            System.out.println("bar");
        }
    }
}

val

使用val作为局部变量声明的类型,而不是实际写入类型。执行此操作时,将从初始化表达式推断出类型。

public Map<String, String> getMap() {
    val map = new HashMap<String, String>();
    map.put("1", "a");
    return map;
}

效果相当于:

public Map<String, String> getMap() {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("1", "a");
    return map;
}

也就是说在局部变量中,Lombok帮你推断出具体的类型,但只能用于局部变量中。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【SpringBoot web-2】web项目参数传递

    新建一个项目,具体步骤可参照上文:SpringBoot系列(二) https://blog.csdn.net/mu_wind/article/details/9...

    云深i不知处
  • 【前端系列-1】ajax与Springboot通信将数据库数据渲染到前端表格

    jQuery对原生js进行了大量封装,让我们使用起来更加方便,尤其ajax。这里就对jQuery的ajax做一个总结。

    云深i不知处
  • 【Java多线程-3】Future与FutureTask

    前文中我们讲述了创建线程的2种方式:直接继承Thread和实现Runnable接口,但这两种方式在执行完任务之后都无法获取执行结果。 自从Java 5开始,J...

    云深i不知处
  • 扑克牌例题与Collections工具类

    我们需要创建四个类,一个封装对象的属性,一个封装牌的花色和大小也就是牌的类型,一个实现发牌,排序,洗牌功能,也就是封装对象的行为,最后一个实现图形化界面。

    端碗吹水
  • Java之面向对象例子(二)

    定义一个Book类,在定义一个JavaBook类继承他 //book类 package com.hanqi.maya.model; public class B...

    二十三年蝉
  • 设计模式之代理模式(Proxy模式)代理模式的引入代理模式的实例程序代理模式分析

    Proxy是代理人的意思,指的是代替别人进行工作的人。当不一定需要本人亲自去做的工作的时候,就可以寻找代理人去完成。 但在代理模式中,往往是相反的,通常是代理...

    desperate633
  • Java基础巩固——反射

    什么是反射 ----    反射机制就是指程序运行时能够获取自身的信息。在Java中,只要给出类的名字,就可以通过反射机制来获取类的信息 哪里用的到反射机制 -...

    Janti
  • java8 Lambda尝尝鲜

    转载:猿天地 链接:http://cxytiandi.com/blog/detail/2196 java8都已经发布这么久了,一直没来得及使用,线上环境基本...

    猿天地
  • 使用JAVA反射的利与弊

    我是攻城师
  • SpringBoot基础篇Bean之条件注入@ConditionalOnProperty

    bean的条件注入,除了前面两篇博文分别介绍的通过@Conditional注解配合Condition接口的基本实现,以及如何使用条件注解@Conditional...

    一灰灰blog

扫码关注云+社区

领取腾讯云代金券