Project Lombok의 공통 Java 객체 기능

Project Lombok은 일반적으로 Java 클래스 용으로 작성되는 상용구 Java 코드의 양을 줄이는 데 사용할 수있는 작은 라이브러리입니다. Project Lombok은 공통 메소드가 필요한 Java 클래스에 추가 할 수있는 주석을 통해이를 수행합니다. 대부분의 주석은 이름에 자체 설명이 있습니다. @Getter, @Setter, @EqualsAndHashCode, @ToString 및 @NoArgsConstructor가 예입니다. 이 게시물에서는 일반적으로 작성된 이러한 메서드를 Java 클래스에 추가하기 위해 간단한 Lombok 주석을 적용하는 방법을 보여줍니다.

다음은 toString ()의 사전 정의 된 재정의 된 버전이없는 간단한 클래스입니다.

toString-less Person.java

package dustin.examples; /** * Simple Person class without boilerplate. * * @author Dustin */ public class Person { private String lastName; private String firstName; } 

위의 클래스가 생성되고 암시 적으로 상속 된 (Object에서) toString () 메서드가 호출되면 출력은 다음 이미지에 표시된 것과 같습니다.

명시적인 toString () 메서드를 작성하거나 Project Lombok을 사용할 수 있습니다. 다음 코드 스 니펫은 Project Lombok 접근 방식을 보여줍니다.

Lombok의 @ToString 어노테이션이있는 Person.java

package dustin.examples; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString public class Person { private String lastName; private String firstName; } 

Lombok에서 제공하는 toString ()을 사용하여이 클래스의 내용을 인쇄 한 결과는 다음과 같습니다.

이제 Person 객체의 더 나은 toString () 표현이 있지만 해당 필드는 여전히 초기화되지 않았으므로 null 값만 볼 수 있습니다. 롬복을 다시 사용하여 생성자를 만들 수 있습니다.

Lombok의 @AllArgsConstructor 주석이있는 Person.java

package dustin.examples; import lombok.AllArgsConstructor; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor public class Person { private String lastName; private String firstName; } 

이제 Person 개체를 인스턴스화 할 때 매개 변수를 전달할 수 있습니다 (사실 필수). 결과는 다음 화면 이미지에 표시됩니다. 이 경우, 내 클라이언트 코드 (Main.java)는 NetBeans에서 컴파일 타임 오류를 보여줍니다. NetBeans는 Person에 두 개의 문자열을 받아들이는 생성자가 있다고 믿지 않기 때문입니다. 빨간색 구불 구불 한 표시에도 불구하고 NetBeans에 빌드를 요청하면 코드가 빌드됩니다.

Person.java와 같은 클래스는 종종 비교 및 ​​해시 코드 기반 컬렉션 키에 사용되어야하는 데이터 클래스입니다. equals (Object) 및 hashCode () 구현을 올바르게 작성하고 함께 작성되었는지 확인하는 것이 중요합니다. 부모 Object 클래스에서 제공하는 기본 equals 및 hashCode 메소드가 있기 때문에 Person 인스턴스를 사용하는 Java 코드는 equals 및 / 또는 hashCode를 수행 할 수 있지만 실제로 원하는 것은 아닙니다. Main 실행 가능 클래스가 다음 코드 목록으로 변경되면 그 이후에 내용이 아닌 ID를 기반으로 동등성 비교가 완전히 수행되고 있음을 알려주는 출력이 표시됩니다.

equals () 구현을 테스트하는 Main.java

package dustin.examples; import static java.lang.System.out; /** * Simple Main for uses Project Lombok-powered classes. * * @author Dustin */ public class Main { public static void main(final String[] arguments) { //final Person person = new Person(); final Person person = new Person("Miles", "Linda"); out.println(person); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = new Person(sameLastName, sameFirstName); final Person person2 = new Person(sameLastName, sameFirstName); if (person1.equals(person2)) { out.println("Same person!"); } else { out.println("Different people!"); } } } 

이것은 여기서 원하는 것이 거의 없습니다. 대신 명시 적 같음 구현이 필요합니다. @EqualsAndHashCode에 대한 Lombok 주석은 명시 적으로 개별적으로 재정의하는 것이 타당하지 않기 때문에이 두 가지를 모두 함께 생성한다는 사실이 마음에 듭니다. Person.java 클래스 목록은 @EqualsAndHashCode 주석이 추가 된 다음에 표시됩니다.

@EqualsAndHashCode가있는 Person.java

package dustin.examples; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor @EqualsAndHashCode public class Person { private String lastName; private String firstName; } 

이제 출력이 더 좋아졌습니다.

필요한 경우 각 공개 필드에 개별적으로 액세스 할 수있는 좋은 방법이 아직 없습니다. 예를 들어, 성을 기반으로 코드에서 무언가를하고 싶다면 과감한 조치를 취하지 않고는 그것을 얻을 수있는 좋은 방법이 없습니다. 여기서 다시 롬복을 사용할 수 있습니다.

이 예에서는 그 사람의 성이 변경 될 수 있다는 잘못된 가정을했다고 가정합니다. 이 가정 때문에성에 대해 Lombok @Setter 주석 만 제공하고 두 필드 모두에 @Getter 주석을 제공합니다. 변경된 사람 코드가 다음에 표시됩니다.

@Getter 및 @Setter가있는 Person.java

package dustin.examples; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor @EqualsAndHashCode public class Person { @Getter @Setter private String lastName; @Getter private String firstName; } 

이 예제를 실행하기 위해 업데이트 된 Main 클래스는 다음과 같습니다.

새로운 Setter / Getter를 사용하는 Main.java

package dustin.examples; import static java.lang.System.out; /** * Simple Main for uses Project Lombok-powered classes. * * @author Dustin */ public class Main { public static void main(final String[] arguments) { //final Person person = new Person(); final Person person = new Person("Miles", "Linda"); out.println(person); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = new Person(sameLastName, sameFirstName); final Person person2 = new Person(sameLastName, sameFirstName); if (person1.equals(person2)) { out.println("Same person!"); } else { out.println("Different people!"); } final Person accessiblePerson = new Person("Garzminski", "Gary"); out.println("The last name is " + accessiblePerson.getLastName()); out.println("The first name is " + accessiblePerson.getFirstName()); //accessiblePerson.setFirstName("Grady"); accessiblePerson.setLastName("Garfunkel"); out.println("The new last name is " + accessiblePerson.getLastName()); } } 

코드가 빌드되도록 Person의 이름을 설정하는 호출을 주석 처리해야했습니다. 이제 다음 화면 스냅 샷에 표시된대로 실행됩니다.

이 Lombok 주석 모음은 일반적으로 특히 데이터 지향 클래스에 대해 바람직 할 가능성이 있습니다. 이러한 이유로 Project Lombok은 이러한 주석 모음을 제공하는 @Data와 같은 집계 주석을 제공합니다. 이 경우 @Data를 사용하여 제공 한 여러 개별 주석과 매우 유사한 동작을 얻을 수 있습니다. @Data 주석은 Lombok가 모든 필드에 @Getter를 적용하고 모든 비 최종 필드에 @Setter를 적용하도록합니다. 내가 사용한 것과 다른 주요 차이점은 @AllArgsConstructor가 아닌 @RequiredArgsConstructor를 사용한다는 것입니다.

Project Lombok이 컴파일 된 .class 파일에 대해 수행 한 작업을 확인하는 가장 좋은 방법 중 하나는 javap를 사용하는 것입니다. 이것은 다음 화면 스냅 샷에 표시됩니다.

이 출력에서 ​​일반적으로 상용구 코드에서 볼 수있는 여러 메서드를 컴파일 된 Person.class에서 사용할 수 있음을 알 수 있습니다. 매개 변수가있는 두 개의 생성자 hashCode (), equals (Object), toString () 및 예상되는 get 및 set 메서드가 있습니다.

Project Lombok에는 걱정과 한계가 없습니다. 이들 중 다수는 Hamlet D' Arcy의 Java Without the Boilerplate-Project Lombok 게시물에 대한 응답으로 설명되어 있습니다. 한 가지 제한은 Eclipse 이외의 IDE에서 지원이 줄어든다는 것입니다 (하지만 NetBeans 지원이 좋고 javac가 지원되지만). 문제는 코드를 사용하고 유지하는 다른 사람들이 Lombok에 새로운 종속성을 가질 필요가 있다는 것입니다. 이 문제는 필요한 경우 빌드 프로세스에서 사용할 수있는 delombok을 사용하여 다소 완화 될 수 있습니다.

Project Lombok을 다루는 다른 기사와 블로그 게시물에는 Project Lombok-Never Write Java Boilerplate Code Again, Java Without the Boilerplate-Project Lombok, Project Lombok : Bye Bye Boilerplate, Java Posse 's Project Lombok Interview, Project Lombok : Put an End to Java Verbosity , Project Lombok-Java Toolkit에 꼭 필요한 도구, Project Lombok : Annotation Processor를 사용한 흥미로운 Bean 단축키, Interview : Lombok의 Reinier 및 Roel, Project Lombok을 사용한 상용구 코드 줄이기, Lombok을 사용한 신속한 개발, Lombok은 상용구 코드를 줄입니다. 게터와 세터를위한 더 나은 대안.

이 이야기, "프로젝트 롬복의 공통 Java 객체 기능"은 원래 JavaWorld에 의해 출판되었습니다.