롬복 게터 / 세터 vs Java 14 레코드


10

나는 Lombok 프로젝트를 좋아 하지만 요즘에는 Java 14의 새로운 기능 중 일부를 읽고 시도하고 있습니다.

새로운 기능에는 생성자, 개인 최종 필드, 접근 자, equals / hashCode, getters, toString 메서드와 같은 기능이 내장 된 클래스를 만들 수 있는 레코드 키워드가 있습니다.

이제 내 질문은 : 롬복의 기능에 의존하는 것이 낫거나 레코드 기능 사용을 시작 해야하는 것입니다.

이것을 사용하는 것이 좋습니다 :

record Person (String name, String surname) {}

또는:

@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
  @Getter private int name;
  @Getter private int surname;
}

두 가지 접근 방식의 장단점은 무엇입니까?


우선, recordJavaBeans 스타일의 getter 및 setter가 필요한 항목에는 작동하지 않습니다.
Mark Rotteveel

2
Rotteveel의 의견은 레코드의 속성 접근 자 메서드 이름이 속성의 이름과 동일하다는 것입니다. 따라서 alice.phoneNumber()get같이 접두사가 붙는 JavaBeans 규칙보다는 alice.getPhoneNumber().
Basil Bourque

1
record기능은이다 미리보기 기능 , 아직 준비가 생산에 사용.
Basil Bourque

레코드는 클래스에 비해 많은 제한이 있으며 레코드는 다른 레코드 나 클래스를 확장 할 수 없습니다. 자세한 내용 은이 JEP openjdk.java.net/jeps/359 의 제한 섹션을 확인 하십시오
NAIT

답변:


9

롬복과 record자바 언어 의 특징은 다른 것들을위한 다른 도구입니다. 약간의 겹치는 부분이 있지만주의를 산만하게하지 마십시오.

롬복은 주로 구문상의 편리 성에 관한 것입니다 . 알려진 유용한 코드 패턴이 사전로드 된 매크로 프로세서입니다. 의미를 부여하지 않습니다. 주석으로 코드에서 설정 한 일부 노브에 따라 패턴을 자동화합니다. 롬복은 순전히 데이터 운반 클래스 구현의 편의성에 관한 것입니다.

레코드는 시맨틱 기능입니다. 그들은 공칭 튜플 입니다. 시맨틱 선언함으로써 Point 하다 터플을 (int x, int y)컴파일러는이 상태 정보로부터 그 표현뿐만 건설 선언 평등, 해시, 문자열로 표현 프로토콜을 유도 할 수있다. 그것들은 의미론을 가지고 있기 때문에 독자와 프레임 워크는 레코드 API에 대해 더 높은 확신을 가지고 추론 할 수 있습니다. (이것은 구문 상 편리 할 수도 있습니다. 그렇다면 훌륭합니다.)


1
+1 Brian Goetz : 현재 Lombok 버전을 IDE로 가져올 수 있다고 가정합니다. 클래스 주석이 부여하지 않는 더 빠른 코드 읽기와 관련하여 롬복에 의미있는 이점이 있는지 궁금합니다.
트렁크

4

나는이 조합을 얼마 동안 가지고 놀았으며 약간의 실습을 통해 다음과 같은 차이점을 나열 할 수 있습니다.

롬복

  • 레코드는 아직 출시 된 기능이 아니며 미리보기 기능 일뿐입니다. 따라서 롬복과 함께하는 것이 더 합리적입니다.
  • 그들은 아직 롬복을 모두 제거하는 강력한 도구가 아닙니다. 라이브러리는 @Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode.
  • 스스로 경험 한 것은 레코드로 마이그레이션 할 때EqualsAndHashCode 예상했던 것과 다릅니다 .

기록

  • 다른 말로, 객체 표현의 요구 사항이 "데이터 캐리어"인 경우 보일러 플레이트 코드를 정확하게 수행하기 위해 추가 라이브러리에 의존하지 않고도 레코드를 활용할 수 있습니다. 결론적 으로이 블로그 는 다음을 읽습니다.

    또한 팀이 수작업으로 코딩 한 기본 패턴 구현을 제거하고 롬복과 같은 라이브러리의 필요성을 줄이거 나 없앨 수 있습니다.

물론, 매일 매일 따라야 할 방법을 선택하는 것은 프로젝트의 요구 사항에 따라 항상 현명합니다.


참고-현재 사용자가 두 가지를 자주 사용하도록하는 더 많은 예제 로이 업데이트를 유지하려고합니다.
Naman

3

NB : 크리스마스 트리의 주석 대신에 @Value수업에서 사용할 수 있습니다 . 이것은 클래스를 최종으로 만들고 모든 필드를 비공개 및 최종으로 만들고 나머지는 모두 제공합니다. 이것은 레코드와 거의 비슷합니다 (마지막이며 내부의 모든 필드가 최종입니다).

record아직 미리보기 상태이므로 프로덕션 코드의 경우 아직 적합하지 않습니다. 롬복을 사용하십시오.

레코드가 미리보기에서 벗어나면 더 복잡합니다. 람은 FAR 유연; 모든 코드를 다시 작성하지 않고도 몇 가지 새로운 측면을 쉽게 바꿀 수 있습니다 (예를 들어 equals 및 hashCode 메소드를 필기하지 않고도 클래스에 'extends'절을 추가 할 수 있습니다. 어떤 레코드는 제공 할 수 없습니다). 롬복은 또한 더 많은 기능을 제공합니다. 예를 들어 @Builder주석을 추가하여 빌더를 추가 할 수 있습니다 . 어떤 기록도 할 수 없습니다.

그것이 매우 가능성이 없다면 당신이 디자인하고있는 수업을 위해 그것을 사용할 것입니다-나는 기록을 사용할 것입니다.

면책 조항 : 저는 Project Lombok의 주요 공헌자입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.