点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家
下一篇:昨天分享资料不小心把百度网盘深处的秘密泄露了
作者:semlinker
www.segmentfault.com/a/1190000020864572
Lombok 是一款 Java 开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的 Java 模型对象(POJO)。
在开发环境中使用 Lombok 插件后,Java 开发人员可以节省出重复构建,诸如 hashCode 和 equals 这样的方法以及各种业务对象模型的 accessor 和 toString 等方法的大量时间。
对于这些方法,Lombok 能够在编译源代码期间自动帮我们生成这些方法,但并不会像反射那样降低程序的性能。
Gradle
在 build.gradle 文件中添加 lombok 依赖:
dependencies {
Maven
在 Maven 项目的 pom.xml 文件中添加 lombok 依赖:
Ant
假设在 lib 目录中已经存在 lombok.jar,然后设置 javac 任务:
由于 Lombok 仅在编译阶段生成代码,所以使用 Lombok 注解的源代码,在 IDE 中会被高亮显示错误,针对这个问题可以通过安装 IDE 对应的插件来解决。
这里不详细展开,具体的安装方式可以参考:
https://www.baeldung.com/lombok-ide
注意:以下示例所使用的 Lombok 版本是 1.18.10
你可以使用 @Getter 或 @Setter 注释任何类或字段,Lombok 会自动生成默认的 getter/setter 方法。
@Getter 注解
@Target({ElementType.FIELD, ElementType.TYPE})
@Setter 注解
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Setter {
// 若setter方法非public的话,可以设置可访问级别
lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
AnyAnnotation[] onMethod() default {};
AnyAnnotation[] onParam() default {};
}
使用示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
Lazy Getter
@Getter 注解支持一个 lazy 属性,该属性默认为 false。当设置为 true 时,会启用延迟初始化,即当首次调用 getter 方法时才进行初始化。
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
通过以上代码可知,调用 getLazy 方法时,若发现 value 为 null,则会在同步代码块中执行初始化操作。
@NoArgsConstructor 注解
使用 @NoArgsConstructor 注解可以为指定类,生成默认的构造函数,@NoArgsConstructor 注解的定义如下:
@Target(ElementType.TYPE)
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
@AllArgsConstructor 注解
使用 @AllArgsConstructor 注解可以为指定类,生成包含所有成员的构造函数,@AllArgsConstructor 注解的定义如下:
@Target(ElementType.TYPE)
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
@RequiredArgsConstructorDemo 注解
使用 @RequiredArgsConstructor 注解可以为指定类必须初始化的成员变量,如 final 成员变量,生成对应的构造函数,@RequiredArgsConstructor 注解的定义如下:
@Target(ElementType.TYPE)
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
3.3 @EqualsAndHashCode 注解
使用 @EqualsAndHashCode 注解可以为指定类生成 equals 和 hashCode 方法, @EqualsAndHashCode 注解的定义如下:
@Target(ElementType.TYPE)
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
使用 @ToString 注解可以为指定类生成 toString 方法, @ToString 注解的定义如下:
@Target(ElementType.TYPE)
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
@Data 注解与同时使用以下的注解的效果是一样的:
@ToString
@Getter
@Setter
@RequiredArgsConstructor
@EqualsAndHashCode
@Data 注解的定义如下:
@Target(ElementType.TYPE)
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
若你将 @Log 的变体放在类上(适用于你所使用的日志记录系统的任何一种);之后,你将拥有一个静态的 final log 字段,然后你就可以使用该字段来输出日志。
@Log
private
@Log4j
private
@Log4j2
private
@Slf4j
private
@XSlf4j
private
@CommonsLog
private static final org.apache.commons.logging.
@Synchronized 是同步方法修饰符的更安全的变体。与 synchronized 一样,该注解只能应用在静态和实例方法上。它的操作类似于 synchronized 关键字,但是它锁定在不同的对象上。synchronized 关键字应用在实例方法时,锁定的是 this 对象,而应用在静态方法上锁定的是类对象。
对于 @Synchronized 注解声明的方法来说,它锁定的是 $LOCK
或 $lock
。@Synchronized 注解的定义如下:
@Target(ElementType.METHOD)
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
使用 @Builder 注解可以为指定类实现建造者模式,该注解可以放在类、构造函数或方法上。@Builder 注解的定义如下:
@Target({TYPE, METHOD, CONSTRUCTOR})
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
@SneakyThrows 注解用于自动抛出已检查的异常,而无需在方法中使用 throw 语句显式抛出。@SneakyThrows 注解的定义如下:
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
你可以在方法或构造函数的参数上使用 @NonNull 注解,它将会为你自动生成非空校验语句。@NonNull 注解的定义如下:
Target({
示例
package com.semlinker.lombok;
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
@Clean 注解用于自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成 try-finally 这样的代码来关闭流。
@Target(ElementType.LOCAL_VARIABLE)
示例
package com.semlinker.lombok;
public class CleanupDemo {
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);
}
}
}
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
public class CleanupDemo {
public CleanupDemo() {
}
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream(args[0]);
try {
FileOutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while(true) {
int r = in.read(b);
if (r == -1) {
return;
}
out.write(b, 0, r);
}
} finally {
if (Collections.singletonList(out).get(0) != null) {
out.close();
}
}
} finally {
if (Collections.singletonList(in).get(0) != null) {
in.close();
}
}
}
}
在类的字段上应用 @With 注解之后,将会自动生成一个 withFieldName(newValue) 的方法,该方法会基于 newValue 调用相应构造函数,创建一个当前类对应的实例。@With 注解的定义如下:
Target({
示例
public
以上代码经过 Lombok 编译后,会生成如下代码:
public
val
val 用在局部变量前面,相当于将变量声明为 final,此外 Lombok 在编译时还会自动进行类型推断。val 的使用示例:
public
以上代码等价于:
class ValExample {
至此功能强大的 Lombok 工具就介绍完了。若你对于它的实现原理感兴趣的话,建议阅读:
https://www.jianshu.com/p/63038c7c515a
示例项目地址:
https://github.com/semlinker/springstack/tree/master/springboot2-lombok
https://projectlombok.org/
https://interviewbubble.com/lombok-cheatsheet/
http://blog.didispace.com/java-lombok-how-to-use/
说句题外话,springboot全家桶技术交流群可以加我微信,但是坑位有限哦,由于忙于工作,有时不能及时回复大家,请多包涵。
猜你喜欢
1、一个秒杀系统的设计思考
2、Spring boot + Jsoup 搭建高清视频解析系统接口只需1分钟
3、如何设计一个安全的对外接口?
4、Stack Overflow 上最火的一个问题:什么是 NullPointerException
5、Spring Boot+Mybatis+Swagger2 环境搭建
6、Redis实战--使用Jedis实现百万数据秒级插入
7、7 个显著提升编码效率的IntelliJ IDEA必备插件
8、免费版的 IDEA 为啥不能使用 Tomcat ?
强烈推荐一位大佬的公众号
好文章,我在看❤️