주석. 1부 - 약간 지루함
이 부분에서는 소스 코드 주석의 잘 알려진 대표자인 Lombok 라이브러리를 다루기로 결정했습니다. 다음 기사에서는 런타임 주석을 다루겠습니다. 옛날에 자바 프로그래머가 있었습니다. 그녀는 매일 다음과 같은 일반적인 코드를 작성했습니다.
package lombok;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
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;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (age != person.age) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
이 클래스는 일반적입니다. 필드가 2개뿐입니다(결국 필드가 10~15개가 넘는 경우도 있습니다). 물론 이 모든 것은 IDE에서 생성될 수 있습니다. 하지만 젠장, 그게 그 자리를 차지합니다. 15-20개의 필드가 있는 경우 각 필드에는 getter, setter, 생성자가 필요합니다. 이 모든 것 중에서 눈에 보이지 않는 몇 가지 다른 메서드는 쉽게 손실될 수 있습니다. 이 프로그래머가 더 빠르고 덜 작성하도록 어떻게 도울 수 있습니까? 롬복. 프라이팬에서 나와 불 속으로. 여기에 동일한 클래스가 있지만 이제 Lombok을 사용합니다.
package lombok;
@Data
public class Person {
private String name;
private int age;
}
그게 다야. 멋지죠? @Data 주석의 기능 은 무엇인가요 ? 컴파일하는 동안 이 주석은 모든 필드에 대한 getter/setter를 생성하고 표준 규칙에 따라 toString(), equals() 및 hashCode()를 재정의합니다. IDE에 플러그인을 설치할 수 있습니다. 아직 생성되지 않은 메서드가 모두 표시됩니다. 이 시점에서 독자 여러분의 관심이 있기를 바랍니다. 다음 내용은 세부 사항에 대한 링크와 함께 간략한 소개가 될 것이기 때문입니다. Lombok을 사용하면 코드 생성을 사용자 정의할 수도 있습니다. 예를 들어 모든 getter 및 setter가 항상 필요한 것은 아니며 해시 코드를 생성하려면 다른 알고리즘이 필요할 수도 있습니다. 이를 달성하기 위해 별도의 주석이 있습니다(많은 주석에는 설명이 필요하지 않을 것 같습니다): @Getter/@Setter, @ToString, @EqualsAndHashCode, @NoArgsConstructor, @RequiredArgsConstructor 및 @AllArgsConstructor, @Log 흔한. 전체 세트는 여기서
볼 수 있습니다 . var 및 val에 특별한 주의를 기울이십시오. 이는 다음과 같은 코드를 작성할 수 있음을 의미합니다.
package lombok;
import lombok.experimental.var;
@Data
public class Person {
private String name;
private int age;
public static void main(String[] args) {
var person = new Person();
person.setAge(22);
System.out.println(person);
}
}
이것이 왜 필요한가요? 예를 들어 RandomAccessFileChannel 클래스가 있습니다. 왜 우리는 이런 코드를 작성하고 싶을까요?
RandomAccessFileChannel channel = new RandomAccessFileChannel();
우리가 이것을 할 수 있다면?
var channel2 = new RandomAccessFileChannel();
내 생각에는 이것이 항상 받아들여지는 것은 아니다. 예를 들어, 사악한 지도를 반환하는 사악한 메소드가 있습니다:
public static Map<List<Set<Integer>>, Set<List<String>>> evilMap() {
return new HashMap<>();
}
다음과 같이 호출하면:
Map<List<Set<Integer>>, Set<List<String>>> listSetMap = evilMap();
그렇다면 우리가 무엇을 하고 있는지는 어느 정도 명확해집니다. 호출이 다음과 같은 경우:
var listSetMap = evilMap();
그러면 악마만이 evilMap()이 거기에서 무엇을 반환할지 알 수 있으며 메서드 자체를 볼 때까지는 알 수 없습니다. 왜 소스 파일을 돌아다니나요? 일반적으로 이에 주의해야 합니다. 실험 분기: 여기에서는 @UtilityClass 주석을 언급하고 싶습니다 . 예외를 발생시키는 비공개 생성자를 생성합니다(그래서 지저분한 작은 손은 거기에 간섭하기 위해 리플렉션을 사용하지 않습니다). 그리고 수업이 시작될 때 매우 아름답습니다. 유틸리티 메소드가 있다는 것을 알려주는 것입니다. @Delegate 주석은 위임 패턴을 구현합니다 . 어떤 것을 다른 클래스에 위임하는 클래스가 있고 일부 메서드만 변경한다고 가정해 보겠습니다. 이 주석을 사용하면 메서드가 중복되는 것을 방지하고 해당 메서드를 추적할 수 있습니다. 메소드를 제거하거나 추가하면 이 주석이 이를 알 수 있습니다. 실험적 주석 분기
GitHub
공식 웹사이트
IDE가 lombok에서 제대로 작동하고 존재하지 않는 메서드를 강조 표시하지 않으려면 플러그인을 설치해야 합니다. 공식 웹사이트에는 각 IDE에 대한 플러그인을 연결하는 방법을 확인할 수 있는 설정 섹션이 있습니다.
보시다시피, lombok은 인기가 많습니다. 별이 5,000개 이상이고 포크가 1,000개 이상입니다. Spring은 클래스에서 lombok을 사용합니다. 프로젝트에 Spring이 있다면 살펴보세요. 여러분도 모르는 사이에 lombok이 도입되었을 수도 있습니다.