[java] 인터페이스의 메소드 구현을 @Override해야합니까?

인터페이스 메소드를 구현하는 메소드에 주석을 달아야 @Override합니까?

주석javadoc은 다음과 같이Override 말합니다.

메소드 선언이 수퍼 클래스에서 메소드 선언을 대체하도록되어 있음을 나타냅니다. 이 어노테이션 유형으로 메소드에 주석이 달렸지만 수퍼 클래스 메소드를 대체하지 않는 경우, 컴파일러는 오류 메시지를 생성해야합니다.

인터페이스가 기술적으로 수퍼 클래스라고 생각하지 않습니다. 아니면?

Question Elaboration



답변

가능하면 @Override를 사용해야합니다. 간단한 실수를 방지합니다. 예:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

제대로 재정의하지 않기 때문에 컴파일되지 않습니다 public boolean equals(Object obj).

인터페이스 ( 1.6 이상 만 ) 를 구현 하거나 Super 클래스의 메서드를 재정의하는 메서드도 마찬가지입니다 .


답변

나는 javac 행동이 변했다고 믿습니다-1.5는 주석을 금지하고 1.6은 그렇지 않습니다. 주석은 추가 컴파일 타임 검사를 제공하므로 1.6을 사용하는 경우 계속 사용하십시오.


답변

@Override사용 가능한 경우 항상 메소드에 주석을 달아야 합니다.

JDK 5에서 이는 수퍼 클래스의 메소드를 대체 함을 의미하고 JDK 6 및 7에서 수퍼 클래스의 메소드를 대체하고 인터페이스의 메소드를 구현하는 것을 의미합니다. 앞에서 언급했듯이 그 이유는 컴파일러가 메서드를 재정의 (또는 구현)하고 있다고 생각하지만 실제로 새 메서드 (서명)를 정의하고 있다고 판단되는 경우 오류를 포착 할 수 있기 때문입니다.

equals(Object)비교의 equals(YourObject)예는 점에서, 표준의 경우이지만, 동일한 인수는 인터페이스 구현을 위해 제조 될 수있다.

인터페이스의 구현 메소드에 주석을 달지 않아도되는 이유는 JDK 5가 이것을 컴파일 오류로 표시했기 때문이라고 생각합니다. JDK 6에서이 주석을 필수로 설정하면 이전 버전과의 호환성이 손상됩니다.

Eclipse 사용자는 아니지만 다른 IDE (IntelliJ)에서는 @Override프로젝트가 JDK 6+ 프로젝트로 설정된 경우 인터페이스 메소드를 구현할 때만 주석이 추가됩니다. 나는 이클립스가 비슷하다고 상상할 것이다.

그러나이 사용법에 대해 다른 주석, 아마도 주석을 선호합니다 @Implements.


답변

나는 모든 기회에 그것을 사용할 것입니다. Java @Override 어노테이션을 언제 사용하며 왜 그 이유를 참조하십시오 .


답변

JDK 5.0에서는 @Override인터페이스에 선언 된 메소드 (컴파일 오류)를 구현하는 경우 주석 을 사용할 수 없지만 JDK 6.0에서는 주석 을 사용할 수 있습니다. 따라서 요구 사항에 따라 프로젝트 환경 설정을 구성 할 수 있습니다.


답변

경우 구체적인 클래스가되지 오버라이드 (override) 추상적 인 방법을 사용 @Override하기위한 구현하는 것은 컴파일러가 변함없이 어떤 구현되지 않은 방법을 경고하기 때문에 개방 문제입니다. 이러한 경우 가독성을 떨어 뜨린다는 주장을 할 수 있습니다. 코드에서 읽는 것이 더 많으며, 덜 호출되는 @Override것은 아닙니다 @Implement.


답변

자신의 클래스에서 상속받은 자신의 메서드를 재정의하면 일반적으로 ide를 사용하여 리팩토링을 중단하지 않습니다. 그러나 라이브러리에서 상속 된 메소드를 대체하는 경우이를 사용하는 것이 좋습니다. 그렇지 않으면 나중에 라이브러리를 변경해도 오류가 발생하지 않지만 숨겨진 버그가 발생합니다.