발전기 게임하기

얼마전에 제가 글을 올렸었는데




그래서 이번에는 같은 실수를 하고 싶지 않아서 이 게시물로 돌아왔습니다.
lombokdependency injection 에 익숙한 사람들을 위한 간단한 연습부터 시작하겠습니다. 다음 블록에서 생성된 코드는 무엇이라고 생각하십니까?

@RequiredArgsConstructor(onConstructor = @__(@Inject))
public class Test {
    @NonNull @Named("testString") private final String testString;
}


나는 대부분의 사람들이 (롬복에 의해 생성된 코드를 본 사람) 이것이 다음과 같이 번역될 것이라고 추측할 것이라고 생각합니다.

public class Test {
    @Generated
    @Inject
    Test(@NonNull @Named("testString") String testString) {
        if (testString == null) {
            throw new NullPointerException("testString is marked non-null but is null");
        } else {
            this.testString = testString;   
        }
    }
}


하지만 그랬다면 우리는 여기 없었을 텐데...
그래서 그것이 실제로 생성하는 것을 보자

public class Test {
    @Generated
    @Inject
    Test(@NonNull String testString) {
        if (testString == null) {
            throw new NullPointerException("testString is marked non-null but is null");
        } else {
            this.testString = testString;   
        }
    }
}


그러나 그것은 이상합니다. @Named로 내 필드에 주석을 달았음을 분명히 알 수 있습니다. 따라서 종속성 주입 중에 이름 검색이 없는 경우 주입할 올바른 종속성을 어떻게 찾을 수 있습니까?

결과적으로 lombok은 해당 동작을 구현하기에는 너무 복잡해지기 때문에 모든 주석을 존중하지 않습니다. 자세한 내용은 github 문제에서 확인할 수 있습니다12.

이제 우리는 이것이 사실이라는 것을 알았으니 문제는 이것을 해결하는 방법입니다.
  • 롬복의 최신 버전에서는 lombok.copyableAnnotations += com.google.inject.name.Named 파일에 lombok.config를 추가할 수 있으며 롬복은 생성자를 생성할 때 이를 복사하려고 합니다.
  • 구식 생성자 기반 주입을 사용하여 작성합니다.

  • public class Test {
        @Inject
        Test(@NonNull @Named("testString") final String testString) {
            this.testString = testString;
        }
    }
    


    나는 몇 가지 이유 때문에 2를 선호합니다.
  • 무엇을 복사할지 결정하는 conf를 lombok.config에 넣으면 너무 많은 정보가 숨겨지고 누군가가 이 코드 샘플을 보고 복사하려고 할 때 충돌이 없었기 때문에 어떻게든 작동할 때 발생하기를 기다리는 사고일 뿐입니다.
  • 복사 가능하도록 구현된 주석만 복사하므로 복사할 수 없는 것을 발견하는 경우 어쨌든 2를 구현하는 것으로 돌아갑니다.
  • 저는 두 번째 코드가 더 표현력이 뛰어나고, 결국에는 사람을 위해 작성하게 되므로 표현력이 더 풍부한 코드를 작성하는 것을 좋아합니다. 너무 많은 것을 숨기지 않고 단순하게 유지하여 사람이 코드 읽기는 주입이 작동하는 이유 또는 작동하지 않는 이유를 이해하는 데 시간을 소비하는 대신 비즈니스 논리에 더 집중할 수 있습니다.
  • 좋은 웹페이지 즐겨찾기