IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 还不快用Lombok,你out了! -> 正文阅读

[Java知识库]还不快用Lombok,你out了!

最近有小伙伴跟我讲,“搞了5年Java,太累了,写的代码又臭又长,每天都要写一堆gettersetter

image-20210722220227844

我对他讲,还不快尝试一下Lombok,这可是炙手可热的大杀器啊,保准让你用了停不下来!

下面我就简单介绍下Lombok有哪些妙处!

简介

Lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码。通俗的说,Lombok可以通过注解在编译器自动生成getter settter等代码,让我们的代码瞬间变得清爽。

有些人不提倡使用Lombok,认为Lombok对代码侵入性太强了,强制整个小组都要使用Lombok,不装,项目就跑不起来。

我想说,你装下,就知道多简单了。2分钟,换来永远的快活,它不香吗?

安装

这里使用Gradle 6.3.8演示

添加依赖

compileOnly("org.projectlombok:lombok:1.18.12")
annotationProcessor("org.projectlombok:lombok:1.18.12")

安装插件

1、打开IDEA的插件页,搜索Lombok,点击安装

image-20210722222109789

2、配置

这里要注意的是,如果你使用的是Gradle高版本(>= 5.0),不需要勾选启用注解处理,如果低于5.0版本,则必须勾选此项。

image-20210722222123357

到这就已经配置好了,是不是超简单?别告诉我你花了超过2分钟!

接下来,就让我们体验一下Lombok的妙处!

image-20210722221523715

使用

我把Lombok生成的源代码都给你列出来了,你还不放心吗?

@NonNull

标记字段不可为null

@Setter
public class Person {
    @NonNull
    private String name;
    @NonNull
    private Integer age;
}

对应的字节码反编译文件:

public class Person {
    @NonNull
    private String name;
    @NonNull
    private Integer age;

    public Person() {
    }

    public void setName(@NonNull String name) {
        if (name == null) {
            throw new NullPointerException("name");
        } else {
            this.name = name;
        }
    }

    public void setAge(@NonNull Integer age) {
        if (age == null) {
            throw new NullPointerException("age");
        } else {
            this.age = age;
        }
    }
}

@Getter/@Setter

自动生成gettersetter方法

public class Person {
    @Getter
    private String name;
    @Setter
    private Integer age;
}

对应的字节码反编译文件:

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

    public Person() {
    }

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

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

@Cleanup

自动关闭流代码

@Cleanup
InputStream in = new FileInputStream(args[0]);

对应的字节码文件:

InputStream in = new FileInputStream(args[0]);
if (Collections.singletonList(in).get(0) != null) {
    in.close();
}

@AllArgsConstructor/@NoArgsConstructor/@RequiredArgsConstructor

自动生成全参构造函数和无参构造函数

@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;
    private Integer age;
}

对应的字节码反编译文件

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

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }
}

@Builder

自动生成建造者模式的bean

@Builder
public class Person {
    private String name;
    private Integer age;
}

对应的字节码反编译文件

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

    Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public static Person.PersonBuilder builder() {
        return new Person.PersonBuilder();
    }

    public static class PersonBuilder {
        private String name;
        private Integer age;

        PersonBuilder() {
        }

        public Person.PersonBuilder name(String name) {
            this.name = name;
            return this;
        }

        public Person.PersonBuilder age(Integer age) {
            this.age = age;
            return this;
        }

        public Person build() {
            return new Person(this.name, this.age);
        }

        public String toString() {
            return "Person.PersonBuilder(name=" + this.name + ", age=" + this.age + ")";
        }
    }
}

@EqualsAndHashCode

自动生成equalshashcode方法

@EqualsAndHashCode
public class Person {
    private String name;
    private Integer age;
}

对应的字节码反编译文件

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

 public Person() {
 }

 public boolean equals(Object o) {
     if (o == this) {
         return true;
     } else if (!(o instanceof Person)) {
         return false;
     } else {
         Person other = (Person)o;
         if (!other.canEqual(this)) {
             return false;
         } else {
             Object this$name = this.name;
             Object other$name = other.name;
             if (this$name == null) {
                 if (other$name != null) {
                     return false;
                 }
             } else if (!this$name.equals(other$name)) {
                 return false;
             }

             Object this$age = this.age;
             Object other$age = other.age;
             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 Person;
 }

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

@ToString

自动生成toString()方法

@ToString
public class Person {
    private String name;
    private Integer age;
}

对应的字节码反编译文件

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

    public Person() {
    }

    public String toString() {
        return "Person(name=" + this.name + ", age=" + this.age + ")";
    }
}

@Value

自动生成全参构造函数、Getter方法、equals方法、hashCode方法、toString方法

@Value
public class Person {
    private String name;
    private Integer age;
}

注意:@Value不会生成Setter方法

@Synchronized

自动为被标记的方法添加synchronized

谨慎使用,出了问题我可不负责!

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

对应的字节码反编译文件

public class SynchronizedExample {
    private static final Object $LOCK = new Object[0];
    private 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");
        }
    }
}

@Delegate

为标记属性生成委托方法,例如在适配器模式下,我们就可以使用此注解简化我们的实现。

public class DelegateExample {
    public void show() {
        System.out.println("show...");
    }
}
@AllArgsConstructor
public class Demo {
    @Delegate
    private final DelegateExample delegateExample;
}

对应的字节码反编译文件

public class DelegateExample {
    public DelegateExample() {
    }

    public void show() {
        System.out.println("show...");
    }
}
public class Demo {
    private final DelegateExample delegateExample;

    public Demo(DelegateExample delegateExample) {
        this.delegateExample = delegateExample;
    }

    // 委托方法
    public void show() {
        this.delegateExample.show();
    }
}

今天就介绍这么多,下次再聊聊Lombok的高级技巧!

我是阿晨,在技术的道路上我们一起砥砺前行!
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:35:34  更:2021-07-23 10:37:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 4:41:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码