A biblioteca Lombok reduz a quantidade de código escrito, melhorando a legibilidade. Exemplo de uso. Uma classe regular
Person
com 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 private
e final
.
@Value
public class Cat {
String name;
int age;
Person person;
}
@With
Anotaçõ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 toString
levará equals
a hashCode
um 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 equals
ehashCode
@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
<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>
GO TO FULL VERSION