Lombok简介
和其他语言相比,Java经常因为不必要的冗长被批评。Lombok提供了一系列注解用以在后台生成模板代码,将其从你的类中删除,从而有助于保持你的代码整洁。较少的模板意味着更简洁的代码,更易于阅读和维护。在本文中,我将涉及我经常使用的Lombok功能,并想你展示如何使用他们生产更清晰、更简洁的代码。
1.局部变量类型推断:val 和 var
许多语言通过查看等号右侧的表达式来推断局部变量类型。尽管现在Java 10+已经支持这种功能,但在之前的版本中没有Lombok的帮助就无法实现。下面的代码段展示了如何显式指定局部类型:
final Map<String, Integer> map = new HashMap<>(); map.put("Joe", 21);
在Lombok中,我们可以通过使用val来缩短它,如下所示:
val valMap = new HashMap<String, Integer>(); valMap.put("Sam", 30);
注意,val在背后创建了一个final且不可变的变量。如果你需要一个可变本地变量,可以使用var。
2.@NonNull
对方法参数进行null检查通常不是一个坏主意,特别是如果该方法形成的API被其他开发者使用。虽然这些检查很简单,但是他们可能变得冗长,特别是当你有多个参数时。如下所示,额外的代码无助于可读性,并且可能从方法的主要目的分散注意力。
public void nonNullDemo(Employee employee, Account account) { if(employee == null) { throw new IllegalArgumentException("Employee is marked @NonNull but is null"); } if(account == null) { throw new IllegalArgumentException("Account is marked @NonNull but is null"); } // do stuff }
理想情况下,你需要null检查——没有干扰的那种。这就是@NonNull发挥作用的地方。通过用@NonNull标记参数,Lombok替你为该参数生成null检查。你的方法突然变得更加简洁,但没有丢失那些安全性的null检查。
public void nonNullDemo(@NonNull Employee employee, @NonNull Account account) { // just do stuff }
默认情况下,Lombok会抛出NullPointerException,如果你愿意,可以配置 Lombok抛出IllegalArgumentException。我个人更喜欢IllegalArgumentException,因为我认为它更适合于对参数检查。
##3.更简洁的数据本文来源gaodaimacom搞#^代%!码&网*类 数据类是Lombok真正有助于减少模板代码的领域。在查看该选项前,思考一下我们经常需要处理的模板种类。数据类通常包括以下一种或全部:
- 构造函数(有或没有参数)
- 私有成员变量的 getter 方法
- 私有非 final 成员变量的 setter 方法
- 帮助记录日志的 toString 方法
- equals 和 hashCode(处理相等/集合)
可以通过 IDE 生成以上内容,因此问题不在于编写他们花费的时间。问题是带有少量成员变量的简单类很快会变得非常冗长。让我们看看Lombok如何通过处理上述的每一项来减少混乱。
3.1. @Getter 和 @Setter
想想下面的Car类。当生成getter和setter时,我们会得到接近 50 行代码来描述一个包含 5 个成员变量的类。
public class Car { private String make; private String model; private String bodyType; private int yearOfManufacture; private int cubicCapacity; public String getMake() { return make; } public void setMake(String make) { this.make = make; } public String getModel() { return model; } public void setModel(String model) { this.model = model; } public String getBodyType() { return bodyType; } public void setBodyType(String bodyType) { this.bodyType = bodyType; } public int getYearOfManufacture() { return yearOfManufacture; } public void setYearOfManufacture(int yearOfManufacture) { this.yearOfManufacture = yearOfManufacture; } public int getCubicCapacity() { return cubicCapacity; } public void setCubicCapacity(int cubicCapacity) { this.cubicCapacity = cubicCapacity; } }