说实话第一次听到Lombok的时候,是从一个带我的匈牙利老师傅那里学来的。那个时候他给了我一套JPA的代码来访问数据库。 当我打开代码的时候,看到满屏幕的错误,打开实体Entity类一看,就一些成员变量的定义,完全没有setter 与getter的方法。 当时我就凌乱了,这什么啊。 后来当他告诉我 去查查lombok我才恍然大悟。
其实对于Java来说我一直都是爱与恨相互纠结。 一方面,Java确实是一种非常成熟的编程语言,具体很多开源的框架跟库,使得开发相对来说比较容易。 但是另一方面,它是非常冗长的, 因为需要编写大量的常用的样板代码。 虽然说在Java8中引入了 Lambdas 跟 stream, 情况变得相对来说好了一些, 但是在某一些方面仍然存在一些差异, 比如编写简单的Java对象Pojo,但是现在有了Lombok这个插件,你会发现我们写代码到底可以多轻松。 因为许多常用的方法像 Setter, getter, toString, equal等等 甚至 构造器 都已经帮你完成了,我们所需要做的就只是
在对的地方添加上注解标记就好了。
首先我们来看看传统的 Java POJO类 应该来怎么定义:
public class User {
private String name;
private String surname;
private int age;
public User(String name, String surname, int age) {
this.name = name;
this.surname = surname;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age
&& Objects.equals(name, user.name)
&& Objects.equals(surname, user.surname);
}
@Override
public int hashCode() {
return Objects.hash(name, surname, age);
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", surname='" + surname + '\'' +
", age=" + age +
'}';
}
}
在这个常规的POJO类中只有三个成员字段, name, surname 和 age。但是它具有常见的POJO类的一切通用元素: getters,** setters, equals, hashCode, 和toString** 方法.
为了完成这个仅仅只有三个成员变量的类,我们竟然写了差不多60行的diamante。 确实,如果你使用IDE的话,IDE确实可以帮你自动生成一些方法的实现,但是在阅读代码的看到这些代码你难道不觉得头疼么。 下面我们通过使用Lombok来简化我们的代码。
首先在项目中添加Lombok的依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependency>
通常情况下在,如果你使用IDE例如Intellji后者Eclipse,你还需要装上 Lombok的Plugin才能正确使用。 Lombok为成员变量提供了一些基本的注解来确保每一个成员变量都能够自动拥有访问的方法。
@EqualsAndHashCode
@ToString
@AllArgsConstructor
public class User {
@Setter
@Getter
private String name;
@Setter
@Getter
private String surname;
@Setter
@Getter
private int age;
}
正如你所见的,我们使用了五个基本的注解。
@EqualsAndHashCode, @ToString 告诉Lombok来生成 equals, hashCode, 和 toString 方法, 在生成这些方法的时候lombok会使用所有的成员变量。 @AllArgsConstructor会自动创建一个包括所有成员的构造器。 @Getter/@Setter annotations 注解会为每一个标记的成员变量自动生成对应的方法。
现在我们只需要像这个正常使用它就好了
User user = new User("John", "Doe", 32);
user.setAge(30);
user.equals(new User("John", "Doe", 30)); // true
如果你不想将注解用在全部的成员变量上,而是仅仅部分变量上,那么你可以提供一个指定的哪一个成员变量需要自动生成方法的变量。 比如在这里,我们不想让 age 这个成员变量出现在 toString 方法里,我们可以这么做:
@EqualsAndHashCode
@ToString(of = {"name", "surname"})
@AllArgsConstructor
public class User {
@Getter
@Setter
private String name;
@Getter
@Setter
private String surname;
@Getter
@Setter
private int age;
}
我想到这里,这些代码已经比我们一开始要好太多了,但是它任然不够简洁。这里重复了大量的 @Getter 和 @Setter 注解。如果你只是需要在Class中仅暴露几个字段,那么使用它们非常方便,但如果您需要为所有字段生成访问器,则会变得烦人又无聊。为了使代码更加简洁, Lombok永续我们在类级上使用这些注解。如果这些注解放在类名之上,那么lombok会自动为我们生成所有字段的访问方法。
@EqualsAndHashCode
@ToString
@AllArgsConstructor
@Getter
@Setter
public class User {
private String name;
private String surname;
private int age;
}
目前为止我们所做的修改并没有改变类的行为,但是却使我们的类看起来更加的简洁。这就是我们使用Lombok想要达到的效果。
除此之外Lombok还有一个注解叫做 @Builder。 下面我们来看一段这样的代码:
@EqualsAndHashCode
@ToString
@AllArgsConstructor
@Getter
@Setter
@Builder
public class User {
private String name;
private String surname;
private int age;
}
我们给User这个类加了一个@Builder的注解,下面我们如果想实例化这个类,你第一想到的是不是:
User user=new User;
user.setxxx();
....
....
但是现在我们可以利用@Builder注解这样生成实例:
User user = User.builder()
.name("John")
.surname("Doe")
.age(32)
.build();
怎么样,是不是很方便,这样你在生成实例的时候来呢setter方法都省得写了。
其实说了这么说,下面这个注解才是Lombok的精华:
简单的来说所有所有的注解我们都可以使用一个注解完成。 对 他就是@Data 注解。
@Data
@Builder
public class User {
private String name;
private String surname;
private int age;
}
我们在定义类的时候 只需要加一个 @Data 注解,其他的注解我们都不需要在添加就可以达到前面所说的所有功能。 不相信的想伙伴可以试一试