JavaRush /Blogue Java /Random-PT /Biblioteca Lombok
Сергей
Nível 40
Москва

Biblioteca Lombok

Publicado no grupo Random-PT
A biblioteca Lombok reduz a quantidade de código escrito, melhorando a legibilidade. Biblioteca Lombok - 1Exemplo de uso. Uma classe regular Personcom três campos:
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 +
                '}';
    }
}
A mesma coisa com lombok
@Data
public class Person {
    private String name;
    private int age;
    private Cat cat;
}
Removemos vários códigos, mas todos os métodos e modificadores permaneceram. Como funciona. Lombok gera código em tempo de compilação. A própria biblioteca lombok está faltando em tempo de execução. Seu uso não aumenta o tamanho do programa. Ao usar o Lombok, nosso código-fonte não será um código Java válido. Portanto, você precisará instalar um plugin para o IDE, caso contrário o ambiente de desenvolvimento não entenderá com o que está lidando. Lombok oferece suporte a todos os principais IDEs Java. A integração é perfeita. Todas as funções como "mostrar uso" e "ir para implementação" continuam funcionando como antes, levando você ao campo/classe apropriado. Então, para classes simples você pode usar a anotação @Data. @Data- gera construtor, getters, setters, métodos equals, hashCode, toString. Para tornar os objetos imutáveis, existe @Value. @Value- gera o construtor, apenas getters, métodos equals, hashCode, toString. E também faz todos os campos privatee final.
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
@WithAnotações e .funcionam bem com classes imutáveis @Builder.
@With
@Builder
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
Se quisermos alterar o campo de um objeto imutável, precisamos fazer um clone desse objeto com um parâmetro alterado. @With- adiciona métodos para cada campo que fazem um clone do objeto com um campo alterado.
Cat anotherCat = cat.withName("Vasya");
anotherCat- um novo objeto cujos valores de campo são iguais aos de cat, exceto para o campo name. @Builder- gera métodos com os quais inicializamos um objeto ao longo de uma cadeia. Isso é conveniente quando não queremos usar um construtor com todos os parâmetros (se nossa classe for imutável, então ela possui um único construtor com todos os parâmetros).
Cat cat = Cat.builder()
                .name("Мурка")
                .age(3)
                .person(person)
                .build();
Chamada cíclica de métodos Se os objetos tiverem comunicação bidirecional, ou seja, referências entre si, o uso dos métodos toStringlevará equalsa hashCodeum erro StackOverflowError. Porque haverá uma chamada cíclica para métodos de objetos aninhados. Este código resultará em um erro:
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);
    }
}
A solução para o problema é quebrar a chamada cíclica removendo o campo do método. @ToString.Exclude- Excluir um campo em um método toString @EqualsAndHashCode.Exclude- Excluir um campo em um método equalsehashCode
@Value
@With
@Builder
public class Cat {
    String name;
    int age;
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    Person person;
}
Mais algumas anotações úteis @Slf4j- adiciona um logger à classe @SneakyThrows- desmarca as exceções verificadas
@Slf4j
public class Main {

    @SneakyThrows
    public static void main(String[] args) {
        log.info("start");
        Files.readAllBytes(Paths.get(""));
    }
}
Anote individualmente Se por algum motivo você precisar apenas de determinados métodos
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
Biblioteca Lombok - 2<h2>Conclusão</h2>Estas são apenas as anotações básicas do lombok, mas são as mais comumente usadas e têm o maior efeito. Você também não deve se deixar levar pela geração de código. <h2>Links</h2>
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION