博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lombok : 让你写 Java代码像C#一样爽
阅读量:4360 次
发布时间:2019-06-07

本文共 2605 字,大约阅读时间需要 8 分钟。

前言

我曾经是一名 .Net 开发,如今的我是一名 Java 开发者。在我享受着 Java 成熟的生态时,我常常怀念 c# 简洁的语法:自动属性、类型推断、自动初始化器 ....

鱼,我所欲也,熊掌亦我所欲也; 二者不可得兼;

直到我遇到了 lombok 。

添加依赖及 IDE 插件

maven 添加依赖:

org.projectlombok
lombok-maven
1.16.14.0

因为 lombok 要在编译器编译时通过操作AST(抽象语法树)改变字节码生成,因此为了让 IDE 能够支持 lombok 需要给 IDE 添加相关插件,下面是 Idea 添加插件的方法:

1071030-20170406215159066-332200810.png

1071030-20170406215205378-602778742.png

使用

"Java的自动属性" -- @Getter & @Setter

Java 程序员在项目中不可避免的需要创建大量的 POJO , 在 POJO 中代码行数最多的就是我们不关心的 Getter 和 Setter 方法。虽然 IDE 可以帮助我们生成代码,但是冗长的代码看着还是很不爽。

看看 lombok 如何帮助我们简化代码:

public class User {    @Getter    @Setter    private String name;    @Getter(AccessLevel.PROTECTED)    @Setter(AccessLevel.PROTECTED)    private Integer age;}

@Getter & @Setter 可以注解在类和属性上,放在类上,会对所有的非静态属性生成Getter&Setter方法,注解在属性上,会对该属性生成Getter&Setter方法。

并可以通过AccessLevel来设置Getter&Setter方法的访问级别。

"Java的类型推断" -- @val

很奇怪为什么 lombok 使用 val 而不是 跟 c# 一样使用 var ?因为 lombok 认为 java 后期可能会增加 var 这个关键字来支持类型推断,事实却是....

@Test    public void valTest() {        val user = getUser();        user.setName("javaNoob");        System.out.println(user.getName());    }    private User getUser(){        return  new User();    }

没有"自动初始化器"的 java ,只能用构造函数 -- @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

@NoArgsConstructor@AllArgsConstructor@RequiredArgsConstructorpublic class User {    @Getter    @Setter    private String name;    @Getter(AccessLevel.PROTECTED)    @Setter(AccessLevel.PROTECTED)    private Integer age;}

顾名思义:NoArgsConstructor 生成无参数构造函数,AllArgsConstructor 生成全部参数构造函数,RequiredArgsConstructor生成@NonNull注解字段的构造函数。

@NonNull 自动生成非空检查

对于 NullPointerException 异常 java 程序员应该再熟悉不过,@NonNull 注解就是帮我们生成Null检查。

@NonNull    private String name;    @Test    public void valTest() {        val user = getUser();        user.setName(null);        System.out.println(user.getName());    }    /**    java.lang.NullPointerException: name    at com.github.javanoob.lombok.User.setName(User.java:11)    */

相当于

private void setName(String name) {        if (name==null){         throw new NullPointerException("name");          }    }

@Synchronized 将方法变成同步方法

@Synchronized    private void syncMethod(){        System.out.println("I am synchronized");    }

相当于

private static final Object $LOCK = new Object[0] ;    private void syncMethod(){        synchronized($LOCK) {            System.out.println("I am synchronized");        }    }

其他

@ToString 生成toString方法;@EqualsAndHashCode 帮你生成 equal()和 hashCode()方法。@Log 帮你生成日志相关代码。

也有一些比较鸡肋的 @Cleanup 感觉完全可以使用try-with-resource 来代替,还有 @SneakyThrows 个人感觉没什么使用场景。

总结

不知何时写 Java代码可以像C#一样爽

相关资料

转载于:https://www.cnblogs.com/javanoob/p/lombok.html

你可能感兴趣的文章
在Logstash的配置文件中对日志事件进行区分
查看>>
字符串之strcmp
查看>>
最长公共子序列(不连续)
查看>>
微服务:Java EE的拯救者还是掘墓人?
查看>>
如何在Centos里面,把.net core程序设为开机自启动
查看>>
1920*1080pc端适配
查看>>
Nutch系列1:简介
查看>>
前端UI框架选择区别对比推荐
查看>>
栈 队列 和 双向队列
查看>>
从垃圾回收看闭包
查看>>
Intel Core Microarchitecture Pipeline
查看>>
如何去除交叉表的子行(列)的小计?
查看>>
Web字体(链接)嵌入
查看>>
switch… case 语句的用法
查看>>
day07补充-数据类型总结及拷贝
查看>>
语言、数据和运算符
查看>>
正则表达式30分钟入门教程
查看>>
sqlserver try catch·
查看>>
怎么在三维世界里叙述五维故事
查看>>
1028: 可乐(2018年中南大学研究生复试机试题 )
查看>>