Java 인터페이스 메소드를 추상으로 선언하는 이유는 무엇입니까?


143

저는 오늘 Eclipse의 "풀 인터페이스"리팩토링 기능을 사용하여 기존 클래스를 기반으로 인터페이스를 만들었습니다. 대화 상자는 새로운 인터페이스의 모든 새로운 메소드를 "추상적 인"메소드로 작성하도록 제공했습니다.

그것의 이점은 무엇입니까?

인터페이스 메소드를 추상으로 선언 할 수 있다는 사실은 특별히 권장되지 않는 언어의 불필요한 기능입니다.

이클립스가 왜 그런 스타일을 지원 하는가, 왜 누군가가 자발적으로 그렇게 선택 하는가?

설명 : 인터페이스 방법이 추상적 인 이유는 묻지 않습니다. 나는 그들이 인터페이스에 있다면 어쨌든 추상적이기 때문에 왜 그것들을 추상적으로 표시하기로 선택했는지 묻고 있습니다.

답변:


146

에 따르면 Java 언어 사양abstract인터페이스에 대한 키워드는 무효이며, 더 이상 사용할 수 있어야합니다. (9.1.1.1 항)

즉, 이전 버전과의 호환성에 대한 Java의 성향으로 인해 abstract키워드가 있는지 여부에 차이가 있을지 의심됩니다 .


1
그것은 내 이해였습니다 (특정 JLS 섹션에 익숙하지는 않았지만). Eclipse가 왜 obselete 표시를 만드는 옵션을 제공하는지 궁금합니다.
Uri

저를 얻었다. 어딘가에 그것이 바람직한 "기능"이라고 결정하고 그것을 넣어야한다. 당신은 아는 바와 같이, 그러한 오픈 소스 유형 중 하나 :)
jdmichal

18
이것이 최상위 답변이지만 사양의 잘못된 섹션을 참조하고 있습니다. 9.1.1.1은 abstract멤버가 아닌 인터페이스 자체 선언에 대한 키워드를 설명합니다 . 아래 @Will의 답변은 정확하며 유효한 링크 소스도 포함되어 있습니다.
얽히고 설킨 개구리

39

이클립스에서 "그것의 이점"(인터페이스 메소드 선언에 요약 추가) 은 jdk1.3의 jdt 이클립스 컴파일러 와의 오래된 호환성 문제입니다.

1.4 이후 jdk 라이브러리는 더 이상 기본 추상 메소드를 포함하지 않습니다 (인터페이스를 구현하는 추상 클래스에서).
구현이 자신의 존재에 의존하기 때문에 Eclipse 1.3 컴파일러 진단을 속이는 것입니다.
Javac 1.3은 1.4 라이브러리 (-bootclasspath 옵션 사용)에 대해 수행을 거부합니다.

Eclipse 컴파일러는 1.4 준수 레벨 Workbench>Preferences>Java>Compiler>JDK Compliance에 있거나 (참조 ) 1.3 준수 모드를 사용하는 경우 1.3 개 이상의 클래스 라이브러리를 사용하기 때문에 현재의 대부분의 Eclipse 프로젝트에서 "추상"이 필요하지 않습니다.


3
잘 찾았어요 따라서 Eclipse 컴파일러에서 더 이상 존재하지 않는 문제를 해결하는 기능입니다.
jdmichal

1
@jdmichal : 정확히, 또한 Uri의 질문에 대한보다 정확한 답변입니다.
VonC 2016 년

39

로부터 자바 SE 7 JLS (Java 언어 사양) : "중복 방법의 공개 및 / 또는 추상적 인 수정을 지정, 허용하지만 스타일의 문제로 낙담하는 인터페이스에서 선언했다."

를 들어 자바 SE 5.0 : "Java 플랫폼의 이전 버전과의 호환성을 위해이가 허용되지만 스타일의 문제로, 낙담, 중복 방법에 대한 추상적 인 수정이 인터페이스에 선언 지정합니다."


9

인터페이스의 JLS 메소드에 따르면 기본적으로 추상적이므로 키워드가 중복됩니다. 이것을 알고, 나는 그것을 "프레젠테이션 혼란을 피하기 위해"사용하지 않을 것입니다.


이것이 정답이어야합니다. 업데이트 된 링크 는 다음과 같습니다. "note"섹션 참조
mork

JLS는 키워드가 인터페이스의 메소드에서 더 이상 사용되지 않는다고 말하지 않습니다. "인터페이스에 선언 된 메소드에 대해 공개 및 / 또는 추상 수정자를 중복 지정하는 것은 허용되지만 스타일 문제로 권장되지 않습니다." JLS # 9.4 .
Lorne의 후작

@EJP 나는 JLS가 키워드가 더 이상 쓸모 없다고 말하지 않았다. 내 개인적인 의견이었다.) . 이제 이것을 명확히하기 위해 답변을 편집 할 것입니다.
Daniel Hiller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.