JavaRush /Java 博客 /Random-ZH /龙目岛图书馆
Сергей
第 40 级
Москва

龙目岛图书馆

已在 Random-ZH 群组中发布
Lombok 库减少了编写的代码量,提高了可读性。 龙目岛图书馆 - 1使用示例。具有三个字段的常规类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、、hashCodetoString要使对象不可变,有@Value. @Value- 生成构造函数,仅生成 getter、方法equalshashCodetoString。并且还执行所有字段privatefinal.
@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- 排除方法中的字段equalshashCode
@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
龙目岛图书馆 - 2<h2>结论</h2>这些只是基本的lombok注解,但是它们是最常用的,作用也是最大的。您也不应该对代码生成过于着迷。<h2>链接</h2>
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION