인터페이스 메소드를 구현하는 메소드에 주석을 달아야 @Override
합니까?
주석 의 javadoc은 다음과 같이Override
말합니다.
메소드 선언이 수퍼 클래스에서 메소드 선언을 대체하도록되어 있음을 나타냅니다. 이 어노테이션 유형으로 메소드에 주석이 달렸지만 수퍼 클래스 메소드를 대체하지 않는 경우, 컴파일러는 오류 메시지를 생성해야합니다.
인터페이스가 기술적으로 수퍼 클래스라고 생각하지 않습니다. 아니면?
인터페이스 메소드를 구현하는 메소드에 주석을 달아야 @Override
합니까?
주석 의 javadoc은 다음과 같이Override
말합니다.
메소드 선언이 수퍼 클래스에서 메소드 선언을 대체하도록되어 있음을 나타냅니다. 이 어노테이션 유형으로 메소드에 주석이 달렸지만 수퍼 클래스 메소드를 대체하지 않는 경우, 컴파일러는 오류 메시지를 생성해야합니다.
인터페이스가 기술적으로 수퍼 클래스라고 생각하지 않습니다. 아니면?
답변:
가능하면 @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 어노테이션을 언제 사용하며 왜 그 이유를 참조하십시오 .
자신의 클래스에서 상속받은 자신의 메서드를 재정의하면 일반적으로 ide를 사용하여 리팩토링을 중단하지 않습니다. 그러나 라이브러리에서 상속 된 메소드를 대체하는 경우이를 사용하는 것이 좋습니다. 그렇지 않으면 나중에 라이브러리를 변경해도 오류가 발생하지 않지만 숨겨진 버그가 발생합니다.
를 포함하는 문제 @Override
는 super.theOverridenMethod()
메소드 를 호출하는 것을 잊어 버렸다고 생각하게한다는 것입니다 . 매우 혼란 스럽습니다 . 이것은 분명해야합니다. 아마도 여기에 Java를 제공해야 할 @Interface
것입니다. 아, 또 반쯤 자바 특유의 또 다른 특징은 ...
를 구현 interface
하는 abstract
클래스 @Override
가 클래스 인 경우 구현이 interface
메소드에 대한 것인지 확인하는 데 유용합니다 . 를 빼고 클래스는 단지 방법과 일치하지 않는 구현 방법 서명이 선언해도 잘 컴파일 할 것이다 ; 일치하지 않는 방법은 구현되지 않은 상태로 유지됩니다. @Zhao가 인용 한 Java 문서@Override
abstract
interface
interface
이 메소드는 슈퍼 타입으로 선언 된 메소드를 대체하거나 구현합니다.
명확하게 abstract
슈퍼 클래스 . 는 interface
수퍼 타입이라고 할 수 없습니다. 따라서 @Override
중복적이고 interface
구체적인 클래스의 메소드 구현에는 적합하지 않습니다 .