2009-08-12 12 views
9

Java 프로그래밍의 경우 @Deprecated 표기법과 인터페이스 메소드를 사용하면 얻을 수있는 이점이 있지만 구현하는 클래스에는없는 점은 무엇입니까?인터페이스에서만 @Deprecated 표기법을 사용하면 어떤 이점이 있습니까?

+0

어쨌든 인터페이스에서 -only- 메소드를 왜 감가 상각합니까? 릴리스 문서에 "Interface 'Joe'를 사용하지 않는 것이 좋습니다." 또는 뭔가. – Zack

+0

인터페이스와 클래스에는 다른 메소드가 있습니다. 혼란스러워서 미안 잭. –

답변

8

Java 언어 자체의 단점이라고 생각합니다. 인터페이스에서 주석을 통해 사용되지 않는 메소드를 지정하고 구현 클래스에서 메소드가 더 이상 사용되지 않는 것으로 간주하지 않는 것은 의미가 없습니다.

메서드의 @ deprecated-ness가 상속 된 경우 더 좋을 것입니다. 불행히도, 자바는 이것을 지원하지 않는 것 같습니다.

IDE와 같은 툴링이 이러한 상황을 어떻게 처리하는지 고려하십시오. 변수의 유형이 인터페이스로 선언되면 @deprecated 메소드가 취소 선으로 렌더링 될 수 있습니다. 그러나 변수의 유형이 구현 클래스로 선언되고 클래스 서명에 @deprecated가 포함되지 않으면 메소드는 취소 선없이 렌더링됩니다.

기본적인 질문은 인터페이스에서 구현되지만 구현 클래스 (또는 확장 인터페이스)에서 메소드가 더 이상 사용되지 않는 것은 무엇을 의미합니까? 유일하게 합당한 의도는 메소드가 클래스 계층 구조의 인터페이스 아래에있는 모든 것에 대해 사용되지 않는 것입니다. 그러나 그 언어는 그 행동을지지하지 않습니다.

6

는 논란 입니다. 사람들이 인터페이스에 코드를 작성하면 해당 인터페이스의 특정 측면을 사용되지 않는 것으로 표시 할 수 있습니다. 그런 식으로 사람들은 그것을 사용하지 않는 것을 압니다.

인터페이스의 구현 클래스는 세부 사항입니다. 이 클래스의 메소드는 인터페이스를 만족 시키지만 단독으로 사용되지 않을 수는 없습니다. 그 방법을 비추천하는 것은 적절할 수도 있고 그렇지 않을 수도 있습니다.

인터페이스를 구현하는 새 클래스를 만드는 것은 사용되지 않는 메소드를 구현해야한다는 것을 의미합니다. 그들은 클래스의 클라이언트가 사용되지 않는 메소드를 사용하지 않는다는 것을 알지 않는 한 아마 작동해야합니다. 예를 들어, HTTP 서블릿 컨테이너를 작성하는 경우 encodeURL()을 사용하지 않아도 HttpServletResponse.encodeUrl() 메소드를 구현해야합니다. 그것은 클래스의 사용자가 그 비추천 메소드를 호출 할 수 있기 때문입니다.

+0

나는 논쟁보다 더 나아갈 것이다 : 나는 그것이 의심 스럽다고 말하고 싶다. 확실히 코드 검토에서 정당화되도록 요청할 것입니다. – CPerkins

+1

왜 안 되니? 즉, 멀티 메소드 인터페이스의 한 메소드가 다음 릴리스에서 제거 될 예정입니다. –

+0

@Eugene : 그럴 수도 있지만이 예에서는 하나의 방법 만 보여주었습니다. 그렇다면 인터페이스가 하나 뿐인 이유는 무엇입니까?:/lol – Zack

11

@Deprecated는 문서이다 (그렇지 않으면 반례를 제공하십시오) 사용되지 않는 메소드 인터페이스가 구현의 관계없이 사용해서는 안 : 내 의견

public interface Joe { 

    @Deprecated 
    public void doSomething(); 

    ... 
} 

public final class Joseph implements Joe { 

    public void doSomething() { 
     ... 
    } 

    ... 
} 
+0

"[구현 방법]이 부적 절한 경우가 적절할 수도 있고 적절하지 않을 수도 있습니다." 특히 인터페이스 메소드 doSomething이 Joe의 모든 구현에 적합하지는 않지만이 특정 구현 인 Joseph에 적합 할 수 있습니다. 따라서 인터페이스의 사용이 중단되었지만 특정 구현에서는 그렇지 않았습니다. – drew

0

인터페이스와 구현에서 부적절한 메소드로 기존 코드를 리팩터링하려는 경우 인터페이스 메소드에 @Deprecated을 사용하여 몇 가지 릴리스에 대해 임시로 새로운 메소드를 임시로 사용할 수 있습니다. 추한 것일 수도 있습니다. 단지 코드를 하위 호환성을 유지하기 위해 사용할 수 있습니다. 그러면 IDE 및 SONAR 보고서에 더 이상 사용되지 않는 메소드가 표시되고 클라이언트가 새 메소드를 사용하도록 표시됩니다.

관련 문제