Binabawasan ng Lombok library ang dami ng nakasulat na code, na pinapabuti ang pagiging madaling mabasa. Halimbawa ng paggamit. Isang regular na klase
Person
na may tatlong field:
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 +
'}';
}
}
Parehong bagay sa lombok
@Data
public class Person {
private String name;
private int age;
private Cat cat;
}
Inalis namin ang isang grupo ng code, gayunpaman, nanatili ang lahat ng mga pamamaraan at modifier. Paano ito gumagana. Ang Lombok ay bumubuo ng code sa oras ng pag-compile. Ang lombok library mismo ay nawawala sa runtime. Ang paggamit nito ay hindi nagpapataas ng laki ng programa. Kapag gumagamit ng Lombok, ang aming source code ay hindi magiging wastong Java code. Samakatuwid, kakailanganin mong mag-install ng isang plugin para sa IDE, kung hindi, hindi mauunawaan ng kapaligiran ng pag-unlad kung ano ang kinakaharap nito. Sinusuportahan ng Lombok ang lahat ng pangunahing Java IDE. Walang putol ang pagsasama. Ang lahat ng mga function tulad ng "ipakita ang paggamit" at "pumunta sa pagpapatupad" ay patuloy na gumagana tulad ng dati, na dadalhin ka sa naaangkop na field/klase. Kaya, para sa mga simpleng klase maaari mong gamitin ang anotasyon @Data
. @Data
- bumubuo ng constructor, getter, setter, method equals
, hashCode
, toString
. Upang gawing hindi nababago ang mga bagay mayroong @Value
. @Value
- bumubuo ng constructor, mga getter lamang, pamamaraan equals
, hashCode
, toString
. At ginagawa din ang lahat ng mga patlang private
at final
.
@Value
public class Cat {
String name;
int age;
Person person;
}
@With
Mga anotasyon at .gumana nang maayos sa mga hindi nababagong klase @Builder
.
@With
@Builder
@Value
public class Cat {
String name;
int age;
Person person;
}
Kung gusto nating baguhin ang field ng isang hindi nababagong object, kailangan nating gumawa ng clone ng object na ito na may isang binagong parameter. @With
- nagdaragdag ng mga pamamaraan para sa bawat field na gumagawa ng clone ng object na may isang binagong field.
Cat anotherCat = cat.withName("Vasya");
anotherCat
- isang bagong bagay na ang mga halaga ng field ay kapareho ng sa cat
, maliban sa field name
. @Builder
- bumubuo ng mga pamamaraan kung saan sinisimulan natin ang isang bagay sa isang chain. Ito ay maginhawa kapag hindi namin nais na gumamit ng isang constructor na may lahat ng mga parameter (Kung ang aming klase ay hindi nababago, pagkatapos ay mayroon itong isang solong konstruktor na may lahat ng mga parameter).
Cat cat = Cat.builder()
.name("Мурка")
.age(3)
.person(person)
.build();
Paikot na tawag ng mga pamamaraan Kung ang mga bagay ay may bidirectional na komunikasyon, i.e. mga sanggunian sa isa't isa, pagkatapos ay ang paggamit ng mga pamamaraan toString
ay equals
hahantong hashCode
sa isang error StackOverflowError
. kasi magkakaroon ng paikot na tawag sa mga pamamaraan ng mga nested na bagay. Ang code na ito ay magreresulta sa isang error:
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);
}
}
Ang solusyon sa problema ay upang masira ang paikot na tawag sa pamamagitan ng pag-alis ng field mula sa pamamaraan. @ToString.Exclude
- Ibukod ang isang field sa isang paraan toString
@EqualsAndHashCode.Exclude
- Ibukod ang isang field sa isang paraan equals
athashCode
@Value
@With
@Builder
public class Cat {
String name;
int age;
@ToString.Exclude
@EqualsAndHashCode.Exclude
Person person;
}
Ang ilang mas kapaki-pakinabang na mga anotasyon @Slf4j
- nagdaragdag ng isang logger sa klase @SneakyThrows
- ginagawang walang check ang mga may check na exception
@Slf4j
public class Main {
@SneakyThrows
public static void main(String[] args) {
log.info("start");
Files.readAllBytes(Paths.get(""));
}
}
Mag-annotate nang paisa-isa Kung sa ilang kadahilanan kailangan mo lamang ng ilang mga pamamaraan
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
<h2>Konklusyon</h2>Ito ang mga pangunahing anotasyon ng lombok, ngunit ang mga ito ang pinakakaraniwang ginagamit at may pinakamalaking epekto. Hindi ka rin dapat madala sa pagbuo ng code. <h2>Mga Link</h2>
GO TO FULL VERSION