这篇文章首发于公号《猫玛尼》
大家好,我是“猫玛尼”,一名程序员。
给大家强烈推荐一个非常实用的Java工具类库——Lombok,它可以有效地减少Java代码的冗长,让你的代码,看上去非常的简洁、优雅。
大家一般都是使用某个IDE(IDE是集成开发环境,它可以有效的提升我们的工作效率),来开发项目。要使用强大的Lombok,首先需要给你的IDE安装上相关的插件。
我平常用的是IntelliJ IDEA(下面都简称为IDEA),Lombok的安装步骤如下:
1、打开IntelliJ IDEA左上角的Preferences,选择Plugins,在搜索框中输入“Lombok”;
2、这个时候搜索结果里面可能没有,那就需要点击搜索结果里面蓝色字体的“Search in repositories”,就是通过在线仓库查找Lombok相关插件。点击超链接后,会弹出“Browse Repositories”在线搜索结果;
3、选中结果集中的“Lombok Plugin”,然后在右侧的插件介绍面板中点击“Install”,安装这个插件;
4、IDEA需要下载该插件,然后在后台安装,一般情况下都挺快的,一分钟不到吧。安装完成之后,刚才你点击的那个绿色的“Install”按钮,会变成“Restart IntelliJ IDEA”,点击这个按钮,重新启动IDEA,就OK了。我们可以去Plugins里面看一下,就能看到我们刚才安装的“Lombok Plugin”插件了。
安装好了插件,需要给项目引入Lombok依赖,可以直接下载Jar丢到你的项目里面,如果是Maven项目的话,可以在pom文件里面添加上依赖。我这边的例子是跑在Maven项目里的。
我一般是在
“https://mvnrepository.com/”这个中心仓库里面查找我想要的各种依赖。这个中心仓库东西很全。在中心仓库里面搜索“Lombok”,结果里的第一个就是,然后点进去选择具体的版本,我一般会选择使用最多的那个版本,这里是“1.18.2”:
把依赖文本复制到我们的pom.xml文件里面,然后“import Changes”,把依赖真正的加到我们项目里面去就OK了:
接下去就可以尽情的使用Lombok工具类库了。一个简单的例子如下:
看例子,能够很明显的感觉到,所写的代码非常简洁、清晰,少了大量的getter、setter、构造器等代码。
一般都是通过注解的方式使用Lombok,简单介绍一下常用的一些注解:
@Data注解:为Java类的所有字段生成getter、一个有用的toString方法和hashCode。还会为所有非final字段生成setter。该注解的作用等同于:@Getter、@Setter、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode一起使用。
@Getter/@Setter注解:给相应的字段加上getter/setter方法,可以用在类或字段上。在类上面,标注这两个注解,表示该类中所有的非静态字段,都会生成相应的getter/setter方法;在字段上标注,则表示只给这个字段生成getter/setter方法,两者都有,则以标注在字段上优先。@Setter注解对final字段失效。
@ToString注解:只能标注在类上,给类生成一个具有一定可读性的toString()方法。
@NoArgsConstructor注解:给类生成一个无参构造器。
@AllArgsConstructor注解:给类生成一个包含所有字段的构造器。
@Builder注解:给类赋予了builder模式(建造者模式)。它可以解决字段很多的类重载多个构造器的繁琐,同时链式调用简化了类的构造。例子中“小码哥”那部分代码片段用到的就是这种模式。
@NonNull注解:可以标注在方法的参数上面。如果标注的这个参数,调用的时候传过来的值为null,则会抛出NPE(空指针异常),这样就不需要在代码中判空了,非常的方便。
@Log注解:可以给类添加一个日志对象log,使用的时候直接log.info("some info")就行,非常的方便。它使用的是Java自带的日志框架,该对象的类型是java.util.logging.Logger。
@Slf4j注解:它也用于记录日志,关于日志,我基本用的是这个注解。全称是simple logging facade for java,是Java的简单的日志门面。它不是具体的日志解决方案,它只服务于各种各样slf4j-logo的日志系统,比如Java自己的日志系统、Log4j、Log4j2、logback、JBossLog等,用Slf4j可以用统一的风格,编写日志代码。以后切换日志系统,也不需要修改任何代码。
还有其他的一些注解,我不太常用,大家有兴趣的也可以去研究一下,比如:@NonFinal、@PackagePrivate、@SuperBuilder、@Wither、@Singular、@Synchronized、@Value、@SneakyThrows等等,具体可以去官网查看他们的使用方法或直接在Jar包里面看代码。官网是:https://www.projectlombok.org/
有想法的开发者,可能会想,这一切,Lombok是怎么实现的呢?
万变不离其宗,就算工具在我们编写代码的这一步做了手脚,编译后的代码还是会还原最真实的面貌。编译后的代码,如下图:
package com.mmn.sum.example;
import java.util.ArrayList;
import java.util.List;
public class LombokUser {
private String name;
private Integer age;
private List
public static void main(String[] args) {
LombokUser anonymous = new LombokUser();
System.out.println(anonymous);
List
mmnHobby.add("打代码");
LombokUser mmn = new LombokUser("猫玛尼", 27, mmnHobby);
System.out.println(mmn);
List
littleZHobby.add("吃东西");
LombokUser littleZ = new LombokUser();
littleZ.setAge(18);
littleZ.setName("小张");
littleZ.setHobby(littleZHobby);
System.out.println(littleZ);
LombokUser xmg = builder().age(36).name("小码哥").hobby(new ArrayList()).build();
System.out.println(xmg);
}
public static LombokUser.LombokUserBuilder builder() {
return new LombokUser.LombokUserBuilder();
}
public String getName() {
return this.name;
}
public Integer getAge() {
return this.age;
}
public List
return this.hobby;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setHobby(List
this.hobby = hobby;
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof LombokUser)) {
return false;
} else {
LombokUser other = (LombokUser)o;
if (!other.canEqual(this)) {
return false;
} else {
label47: {
Object this$name = this.getName();
Object other$name = other.getName();
if (this$name == null) {
if (other$name == null) {
break label47;
}
} else if (this$name.equals(other$name)) {
break label47;
}
return false;
}
Object this$age = this.getAge();
Object other$age = other.getAge();
if (this$age == null) {
if (other$age != null) {
return false;
}
} else if (!this$age.equals(other$age)) {
return false;
}
Object this$hobby = this.getHobby();
Object other$hobby = other.getHobby();
if (this$hobby == null) {
if (other$hobby != null) {
return false;
}
} else if (!this$hobby.equals(other$hobby)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(Object other) {
return other instanceof LombokUser;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $name = this.getName();
int result = result * 59 + ($name == null ? 43 : $name.hashCode());
Object $age = this.getAge();
result = result * 59 + ($age == null ? 43 : $age.hashCode());
Object $hobby = this.getHobby();
result = result * 59 + ($hobby == null ? 43 : $hobby.hashCode());
return result;
}
public String toString() {
return "LombokUser(name=" + this.getName() + ", age=" + this.getAge() + ", hobby=" + this.getHobby() + ")";
}
public LombokUser() {
}
public LombokUser(String name, Integer age, List
this.name = name;
this.age = age;
this.hobby = hobby;
}
public static class LombokUserBuilder {
private String name;
private Integer age;
private List
LombokUserBuilder() {
}
public LombokUser.LombokUserBuilder name(String name) {
this.name = name;
return this;
}
public LombokUser.LombokUserBuilder age(Integer age) {
this.age = age;
return this;
}
public LombokUser.LombokUserBuilder hobby(List
this.hobby = hobby;
return this;
}
public LombokUser build() {
return new LombokUser(this.name, this.age, this.hobby);
}
public String toString() {
return "LombokUser.LombokUserBuilder(name=" + this.name + ", age=" + this.age + ", hobby=" + this.hobby + ")";
}
}
}
我们可以清楚的看到,编译后的代码,比原来多了很多的Getter、Setter,还有equals、LombokUserBuilder等。
我们做技术的,在个人能力没有触达的地方,可以通过强大的Google、Baidu来借助高人。
我翻阅了一些资料,原来 Lombok实现了JSR 269 API,即插入式注解处理API。它提供了一套标准API来处理Annotations,我们可以利用JSR 269提供的API来构建一个功能丰富的元编程(metaprogramming)环境。有兴趣的同学,可以自行深入研究。
用起来很简单,但是背后的设计思想还是很厉害的。
感谢高人,为我们提供了这么好的工具类库~
点赞是一种态度~感谢老铁!
【我平时的开发环境】
饭碗:Mac Pro 13寸
IDE:IntelliJ IDEA 2018
JDK:8
打包:Maven 3
欢迎围观《猫玛尼》,基本每天都会给大家带来服务端的技术分享。