Java 16에서 지원되는 새로운 기능의 사용: DD 장기 업데이트에 설명되어 있습니다.
방금 소개했지만 코딩 습관이나 사양 측면에서 향후 애플리케이션의 변화에 대해서는 이야기하지 않았습니다. 최근 일부 파트너의 코드에 대한 상호 검토로 인해 주로 기록에 초점을 맞춘 일부 논의 주제가 발생했으며 실제로 사용하는 일부 시나리오를 대체 할 수 있습니다.
오늘은 롬복을 대체할 수 있는 레코드에 대해 간략하게 정리해 보았습니다.
Lombok의 힘
Lombok은 코드를 훨씬 깔끔하게 만들어주기 때문에 항상 즐겨 사용하는 도구입니다. 예를 들어 사용자 객체를 작성해야 할 때 Lombok을 사용하지 않으면 작성해야 할 내용이 너무 많을 때가 많습니다:
public class User {
private String username;
private String email;
private int userId;
public User(String username, String email, int userId) {
this.username = username;
this.email = email;
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if (userId != user.userId) return false;
if (username != null ? !username.equals(user.username) : user.username != null) return false;
return email != null ? email.equals(user.email) : user.email == null;
}
@Override
public int hashCode() {
int result = username != null ? username.hashCode() : 0;
result = 31 * result + (email != null ? email.hashCode() : 0);
result = 31 * result + userId;
return result;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", email='" + email + '\'' +
", userId=" + userId +
'}';
}
}
롬복에서는 @Data 어노테이션을 사용하여 위의 내용을 다음 줄로 줄일 수 있습니다:
@Data
public class User {
private String username;
private String email;
private int userId;
}
데이터 어노테이션은 @Getter, @Setter, @EqualsAndHashCode, @toString을 포함하므로 하나의 어노테이션으로 멤버 변수의 Getter 및 Setter, 같음 및 해시코드 메서드의 재정의, toString의 재정의가 가능합니다. 코드의 양이 크게 줄어들고 코드가 더 깔끔하게 보입니다.
Lombok
롬복은 훨씬 적은 코딩으로 도움을 줄 수 있지만 여전히 다음과 같은 몇 가지 단점이 있습니다:
- 롬복은 Java에서 공식적으로 제공하지는 않지만 커뮤니티에 의존하여 유지 관리하는 타사 종속성입니다. 일반적으로 최신 Java 버전과의 호환성 문제가 있으며, 예측할 수 없는 이상한 오류가 발생하기 쉽습니다.
- IDE 호환성 제한, 모든 IDE가 롬복과 완벽하게 호환되는 것은 아니므로 결과적으로 몇 가지 이상한 오류가 발생할 수 있습니다.
대신 레코드를 사용하세요
Lombok 문서에서 클래스의 필드인 생성자, equals(), hashCode() 및 toString()을 기반으로 record 클래스를 자동으로 생성할 수 있다고 언급했습니다. 이 기능은 위에서 설명한 롬복의 @Data와 매우 유사합니다.
이렇게 한 줄로 작성하는 것도 매우 간단합니다:
public record UserRecord(String username, String email, int userId) {}
보시다시피 코드가 롬복 구현보다 훨씬 깔끔합니다. 또한 핵심은 이 기능이 Java에서 기본적으로 지원되며 타사 종속성을 도입할 필요가 없다는 점입니다!
레코드 클래스 정의가 완료되면, 다른 클래스의 일반적인 사용과 동일하게 인스턴스를 생성하고 메서드를 호출하는 구체적인 사용법은 다음과 같습니다:
UserRecord userRecord = new UserRecord("didi", "didi@didispace.com", 35);
System.out.println(userRecord.email());
System.out.println(userRecord.toString());
레코드와 롬복을 사용할 때 자동으로 생성되는 코드의 차이점만 이해하면 바로 시작할 수 있습니다.
예를 들어, 위의 예제에서 차이점을 확인할 수 있습니다. 멤버 변수 이메일을 가져올 때 여기서는 기존 게터에서처럼 getEmail()로 생성되지 않습니다.
대체가 불가능한 상황에는 어떤 것이 있나요?
기록 클래스는 이미 강력하지만 현재로서는 롬복의 완전한 대체품은 아닙니다. 주요 이유는 다음과 같습니다:
- 레코드에 정의된 멤버 변수는 최종 유형이며 초기화 후에는 수정할 수 없습니다.
- 레코드 클래스는 상속할 수 없으므로 더 이상 확장할 수 없습니다.
따라서 롬복 대신 레코드를 사용할 때는 변경될 수 있는 인스턴스 변수보다 정적 변수를 정의하는 데 더 많이 사용됩니다. 그러나 함수도 레코드로 정의할 수 있으므로 멤버 계산을 위해 얻은 콘텐츠 중 일부에 함수를 구현하여 사용할 수 있습니다.
요약
롬복과 레코드는 모두 깔끔한 코드를 작성하는 데 도움이 될 수 있습니다. 전자는 타사 라이브러리이며 예측할 수없는 문제와 IDE 호환성 문제가있을 수 있지만 기능이 더 포괄적이고 강력하며 후자는 기능이 약간 약하지만 Java의 기본 기능에 속하지만 사용하면 많은 코드 작성을 줄일 수 있으며 IDE 호환성이 더 좋습니다.
오늘의 공유는 여기까지입니다. 학습 과정에 어려움이 있으신가요? 초고품질에 참여하고, 교류와 토론에 참여하여 더 나은 학습과 발전을 이룰 수 있습니다! 더 많은 지원을 수집하고 전달하는 것을 환영합니다!




