• lombok 的使用讲解


    前言

    在项目中经常会看到lombok的应用,此文作为科普帖,详细介绍lombok

    1. 基本知识

    简介:
    Project Lombok是一款用于Java开发的工具,旨在通过自动生成样板代码来简化Java代码的编写。
    它通过注解(Annotation)的方式,帮助开发人员自动生成一些常见的Java代码,如Getter、Setter、构造函数等,从而减少样板代码的编写,提高开发效率。
    工作原理:
    Lombok通过在Java源代码中使用注解,实现了在编译阶段自动生成代码的功能。
    当开发人员在类或字段上使用Lombok提供的注解时,Lombok在编译源代码时会通过插入AST(Abstract Syntax Tree)操作,在生成的Java字节码中加入相应的代码。这样,在运行时,代码中就包含了通过注解生成的代码,而开发人员无需手动编写这些冗长的代码。

    其优缺点如下:

    优点缺点
    1.简化代码: Lombok通过自动生成常见的样板代码,减少了开发人员需要编写的代码量,提高了代码的简洁性。
    2. 提高开发效率: 通过自动生成代码,开发人员能够更专注于业务逻辑,减少了重复性劳动,提高了开发效率。
    3. 可读性: 由于生成的代码是标准的、一致的,提高了代码的可读性。
    1.隐藏细节: 自动生成的代码可能会隐藏一些细节,开发人员可能不太容易理解具体的实现方式。
    2. 不适用于所有场景: Lombok适用于生成一些常见的代码,但并不适用于所有的场景。在某些复杂的情况下,可能需要手动编写代码。
    3. 工具依赖: 开发团队需要在开发环境中安装Lombok插件或者通过构建工具配置来支持Lombok,这增加了项目的工具依赖。

    2. 代码应用

    再最新版的idea中都有自动捆绑该插件,如果没有无法使用lombok则在软件中添加即可

    先引入Maven文件中的依赖:

    <dependency>
    	<groupId>org.projectlombokgroupId>
    	<artifactId>lombokartifactId>
    	<version>>${lombok.version}version>
    	<scope>providedscope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    对于lombok的注解,主要有如下:

    • @Setter 和 @Getter
    import lombok.Getter;
    import lombok.Setter;
    
    public class MyClass {
        @Getter
        @Setter
        private String name;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    等价于:

    public class MyClass {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • @AllArgsConstructor
    import lombok.NoArgsConstructor;
    import lombok.AllArgsConstructor;
    
    @NoArgsConstructor
    @AllArgsConstructor
    public class MyClass {
        private String name;
        private int age;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    等价于:

    public class MyClass {
        private String name;
        private int age;
    
        public MyClass() {
            // 无参构造方法
        }
    
        public MyClass(String name, int age) {
            // 有参构造方法
            this.name = name;
            this.age = age;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • @NoArgsConstructor :该注解使用在类上,提供无参构造

    • @Data :(包含了@Getter、@Setter、@ToString、@EqualsAndHashCode和@AllArgsConstructor的功能)
      需要注意的是:同时使用 @Data 和 @AllArgsConstructor 后 ,默认的无参构造函数失效,如果需要它,要重新设置 @NoArgsConstructor

    import lombok.Data;
    
    @Data
    public class MyClass {
        private String name;
        private int age;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • @Log(这是一个泛型注解,具体有很多种形式):@Slf4j :在类上注解后,可直接调用log
    log.info(xxxx);
    
    • 1
    • @ToString :该注解使用在类上,编译后toString方法返回将会以字段的名称-值的形式输出

    • @EqualsAndHashCode :该注解使用在类上,同时生成 equals 和 hashCode 。

    • @NonNull :增加不为空判断

    public NonNullExample(@NonNull Person person) {
    	this.name = person.getName();
    }
    
    • 1
    • 2
    • 3

    转换为:

    public NonNullExample(@NonNull Person person) {
    	if (person == null) {
    		throw new NullPointerException("person");
    	}
    	this.name = person.getName();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • @Cleanup:自动化关闭流,相当于 try with resource
    @Cleanup
    InputStream in = new FileInputStream(args[0]);
    @Cleanup
    OutputStream out = new FileOutputStream(args[1]);
    
    • 1
    • 2
    • 3
    • 4
    • @SneakyThrows :当我们需要抛出异常,在当前方法上调用,不用显示的在方法名后面写 throw
    @SneakyThrows(Exception.class)
    
    • 1
    • @Synchronized :方法中所有的代码都加入到一个代码块中,默认静态方法使用的是全局锁,普通方法使
      用的是对象锁,当然也可以指定锁的对象。
    private final Object lock = new Object();
    	@Synchronized("lock")
    	public void foo() {
    		// Do something
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    openGauss通过VIP实现的故障转移
    43.C语言-学生成绩排名,并且要求输出原来的位置号以及成绩
    深度学习入门(三十四)卷积神经网络——DenseNet
    CSS @符规则(@font-face、@keyframes、@media、@scope等)
    Java项目:SSM在线宿舍管理系统
    git clone和git init git pull 的一点问题
    Rails 中的布局和渲染
    SpringBoot中异步注解@Async介绍
    【C++面向对象】11. 数据抽象*
    基于DPU和HADOS-RACE加速Spark 3.x
  • 原文地址:https://blog.csdn.net/weixin_47872288/article/details/134532104