Lombok 库减少了编写的代码量,提高了可读性。 使用示例。具有三个字段的常规类
Person
:
public class Person {
private String name;
private int age;
private Cat cat;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name) &&
Objects.equals(cat, person.cat);
}
@Override
public int hashCode() {
return Objects.hash(name, age, cat);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", cat=" + cat +
'}';
}
}
与龙目岛一样
@Data
public class Person {
private String name;
private int age;
private Cat cat;
}
我们删除了一堆代码,但是所有方法和修饰符仍然保留。怎么运行的。Lombok 在编译时生成代码。lombok 库本身在运行时丢失。它的使用不会增加程序的大小。当使用 Lombok 时,我们的源代码将不是有效的 Java 代码。因此,您需要为IDE安装一个插件,否则开发环境将无法理解它在处理什么。Lombok 支持所有主要的 Java IDE。集成是无缝的。所有功能(例如“显示用法”和“转到实现”)都将继续像以前一样工作,将您带到适当的字段/类。因此,对于简单的类,您可以使用注释@Data
。 - 生成构造函数、 getter @Data
、setter、方法equals
、、hashCode
。toString
要使对象不可变,有@Value
. @Value
- 生成构造函数,仅生成 getter、方法equals
、hashCode
、toString
。并且还执行所有字段private
和final
.
@Value
public class Cat {
String name;
int age;
Person person;
}
@With
注释和 .与不可变类配合得很好@Builder
。
@With
@Builder
@Value
public class Cat {
String name;
int age;
Person person;
}
如果我们想改变一个不可变对象的字段,那么我们需要用一个改变的参数来克隆这个对象。 @With
- 为每个字段添加方法,使用一个已更改的字段克隆对象。
Cat anotherCat = cat.withName("Vasya");
anotherCat
- 一个新对象,其字段值与 的字段值相同cat
,但字段 除外name
。 @Builder
- 生成我们沿着链初始化对象的方法。当我们不想使用带有所有参数的构造函数时,这很方便(如果我们的类是不可变的,那么它有一个带有所有参数的构造函数)。
Cat cat = Cat.builder()
.name("Мурка")
.age(3)
.person(person)
.build();
方法的循环调用 如果对象具有双向通信,即 互相引用,那么使用这些方法 toString
就会equals
导致hashCode
错误StackOverflowError
。因为 将会循环调用嵌套对象的方法。此代码将导致错误:
public class Main {
public static void main(String[] args) {
Person person = new Person();
Cat cat = Cat.builder()
.name("Мурка")
.age(3)
.person(person)
.build();
person.setName("Ivan");
person.setAge(26);
person.setCat(cat);
System.out.println(person);
System.out.println(cat);
}
}
该问题的解决方案是通过从方法中删除该字段来中断循环调用。 @ToString.Exclude
- 排除方法中的字段toString
@EqualsAndHashCode.Exclude
- 排除方法中的字段equals
并hashCode
@Value
@With
@Builder
public class Cat {
String name;
int age;
@ToString.Exclude
@EqualsAndHashCode.Exclude
Person person;
}
几个更有用的注释 @Slf4j
- 将记录器添加到类中 @SneakyThrows
- 使检查的异常成为未检查的
@Slf4j
public class Main {
@SneakyThrows
public static void main(String[] args) {
log.info("start");
Files.readAllBytes(Paths.get(""));
}
}
单独注释 如果由于某种原因你只需要某些方法
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
<h2>结论</h2>这些只是基本的lombok注解,但是它们是最常用的,作用也是最大的。您也不应该对代码生成过于着迷。<h2>链接</h2>
GO TO FULL VERSION