효과적인 자바! 재정의 주석을 일관되게 사용

이전 장에서 우리는 재미있었지만 많은 개발자들이 일상적으로 하게 될 것은 아닌 주석 생성에 대해 논의했습니다. 오늘 우리는 당신이 훨씬 더 자주 상호 작용할 무언가에 대해 논의합니다. 그것이 @Override 주석입니다. 이 주석은 매우 간단하지만 일부 버그를 피하고 일부 결함을 컴파일 타임에 푸시하고 프로세스 후반에 푸시하는 데 도움이 됩니다. 요점을 설명하기 위해 다음 예를 살펴보겠습니다.

public class Bigram {
  private final char first;
  private final char second;

  public Bigram(char first, char second) {
    this.first = first;
    this.second = second;
  }

  public boolean equals(Bigram b) {
    return b.first == first && b.second == second;
  }

  public hashcode() {
    return 31 * first + second;
  }

  public static void main(String[] args) {
    Set<Bigram> s = new HashSet<>();
    for (int i = 0; i < 10; i++) {
      for (char ch = 'a'; ch <= 'z'; ch++) {
        s.add(new Bigram(ch, ch));
      }
    }
    System.out.println(s.size());
  }
}

이 코드는 소문자 알파벳을 반복하고 Bigram와 동일한 문자 두 개를 세트에 추가합니다. 이 작업을 10회 반복합니다. 동일한 작업을 반복해서 수행하고 결과를 세트에 넣고 복제본은 세트에 넣을 수 없기 때문에 크기가 26이 될 것으로 예상할 수 있지만 실제로는 260개의 요소로 끝납니다. 중복 삽입이 허용된 이유를 알 수 있습니까? 이 코드의 작성자는 확실히 기본 클래스 Objectequals 기능을 재정의하려고 했지만 불행히도 서명을 엉망으로 만들었습니다. 이는 작성자가 equals 함수를 재정의하지 않고 재정의했기 때문입니다. 그것을 재정의하려면 함수가 Object가 아니라 Bigram를 취해야 합니다.

여기에서 @Override 주석을 사용할 수 있습니다. 코드 작성자가 컴파일 시간에 메서드에 이 주석을 추가했다면 컴파일러는 재정의할 메서드가 없다는 오류를 발생시켰을 것입니다.

초기 컴파일 중에 @Override 주석의 이점을 대부분 얻을 수 있습니다. 그러나 그 이상은 여전히 ​​사용할 수 있습니다. IDE는 이 정보를 사용하여 코드에 정보를 추가하고 안전한 방식으로 개발할 수 있습니다. 마지막으로, 어떤 메서드가 재정의되고 어떤 메서드가 그렇지 않은지 미래 개발자와 통신하는 문제로 사용할 수 있습니다.

요약하면, 함수를 재정의할 때 항상 @Override 주석으로 해당 함수에 주석을 달아야 합니다. 이것은 당신이 작성하는 클래스의 더 나은 안전성과 문서화를 제공할 것입니다.

좋은 웹페이지 즐겨찾기