这个

1、Lombok简介

首先我们来介绍Lombok是个什么东西?Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。

官方地址:https://projectlombok.org/

github地址:https://github.com/rzwitserloot/lombok。

学习参考网址:https://zhuanlan.zhihu.com/p/32779910

2、为何要使用Lombok

我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要增加属性或者对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法。这样重复的劳动没有任何意义,Lombok里面的注解可以轻松解决这些问题。

3、Lombok的缺点

无法支持多种参数构造器的重载

4、如何使用Lombok

下面我们主要讲的是Android平台的使用
https://projectlombok.org/setup/android

idea中需要添加插件才能支持Lombok,安装插件并重启。

插件可以直接搜索Android Studio的插件库进行安装。或者下载到本地进行安装:

https://plugins.jetbrains.com/plugin/6317-lombok-plugin

Follow the previous instructions (Gradle). In addition to setting up your gradle project correctly, you need to add the Lombok IntelliJ plugin to add lombok support to Android Studio:

  • 1.Go to File > Settings > Plugins
  • 2.Click on Browse repositories…
  • 3.Search for Lombok Plugin
  • 4.Click on Install plugin
  • 5.Restart Android Studio

image

添加Gradle依赖

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.4'
    annotationProcessor 'org.projectlombok:lombok:1.18.4'
}

5.Lombok的使用

下面,我们主要介绍Lombok几个常用的注解.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@Data
# 注解在 类 上;提供类所有属性的 get 和 set 方法,此外还提供了equals、canEqual、hashCode、toString 方法。通常情况下,基本上使用这个注解就足够了。


@Getter / @Setter
# 可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。
# 并可以指定Getter/Setter方法的访问级别。
@Setter(value = AccessLevel.PUBLIC)
@Setter(value = AccessLevel.PROTECTED)
# 访问界别设置
public enum AccessLevel {
PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,
/** Represents not generating anything or the complete lack of a method. */
NONE;
}


@EqualsAndHashCode
#默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。


@ToString
#生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出,以逗号分割。

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
#无参构造器、部分参数构造器、全参构造器,当我们需要重载多个构造器的时候,Lombok就无能为力了。


@Log4j
#注解在类 上;为类提供一个属性名为log 的 log4j 日志对象,提供默认构造方法。

@NonNull
#注解在属性上,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常,也会有一个默认的无参构造方法。


@Cleanup
#这个注解用在 变量 前面,可以保证此变量代表的资源会被自动关闭,默认是调用资源的 close() 方法,如果该资源有其它关闭方法,可使用 @Cleanup(“methodName”) 来指定要调用的方法,也会生成默认的构造方法

更多的可以参考:https://zhuanlan.zhihu.com/p/32779910

问题:使用IDE集成的时候。报错:Lombok Requires Annotation Processing 需要运行注解

解决方法:https://stackoverflow.com/questions/38911888/lombok-requires-annotation-processing

文章参考:https://blog.csdn.net/zhanlanmg/article/details/50392266
https://projectlombok.org/features/EqualsAndHashCode

原文中提到的大致有以下几点:

  1. 此注解会生成equals(Object other) 和 hashCode()方法。
  2. 它默认使用非静态,非瞬态的属性
  3. 可通过参数exclude排除一些属性
  4. 可通过参数of指定仅使用哪些属性
  5. 它默认仅使用该类中定义的属性且不调用父类的方法
  6. 可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。

另:@Data相当于

@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。

通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。 比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。

修复此问题的方法很简单:

  1. 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。

  2. 或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。