Java 인터페이스의 모든 메소드 선언이 공개적인 것은 아닙니다. 메소드를 이러한 수정 자로 선언해야합니까?


14

Java 8부터 default메소드가 인터페이스에 도입되었습니다. 효과적으로,이 방법은있는 모든 방법은 interface있습니다 abstract.

Java 9 (아마도)부터 private메소드가 허용됩니다. 이 의미에서 모든 방법은 interface있습니다 public abstract.

"자바 인터페이스의 메소드가 public액세스 수정자를 사용하거나 사용하지 않고 선언해야합니까 ?" 스택 오버플로에서 https : //.com/questions/161633/should-methods-in-a-java-interface-be-declared-with-or-with-out-a-public-access-m

거기에, 대부분의 답변은 public abstract에있는 방법이 interface이외의 것이 될 수 없으므로 사용해서는 안된다고 주장했습니다 public abstract. 그것은 더 이상 사실이 아닙니다.

따라서 이러한 새로운 인터페이스 기능을 고려하여 public abstract키워드를 Java 인터페이스 메소드 선언에 사용해야 합니까?

특정 환경에서는 소프트웨어 엔지니어는 경험하지만 Java에서는 경험이없는 사람들이 수시로 Java 코드를 읽습니다. 나는 밖으로 떠나는 느낌 public abstract키워드 것은 이제 인터페이스는이 키워드를 사용하는 다른 규칙을 가지고 온 방법의 역사에 익숙하지 않은 사람들을 위해 혼란의 추가 점을 생성합니다.


5
Java 8 JLS를 확인 했습니까? SO의 예전 대답과 같은 섹션 은 기본 방법의 도입이 동일한 중복성 고려 사항을 기반으로 한 사전 권장 사항을 변경하지 않았 음을 제안합니다. " default수정 자 또는 수정자가 없는 인터페이스 방법 static은 암시 적으로 abstract... abstract"이러한 메소드 선언에 수정자를 중복 지정하도록 스타일 문제로 권장하지 않습니다 ." 왜 상황이 변해야한다고 생각하십니까?
gnat

3
메서드가 암시 적으로 abstract적용되는 조건 이 점점 복잡해지고 있기 때문에 상황이 바뀔 수 있다고 생각했습니다 . 자바 9에서, 한 문장이 될 수도, "는 부족한 인터페이스 방법 default수정 또는 static수정 또는 private수정 암시 추상적 인 ...입니다"또한, 명시 적으로 키워드를 사용하지 않는 보조 인자, 즉, 모든 인터페이스 방법이라는 것을 public abstract, 지금은 바보입니다.
David Campbell

TBH "기본"메소드에 대한 추론을 이해하지 못하며 정적 메소드조차도 인터페이스가 일반적으로 의도하는 범위를 벗어납니다. 인터페이스는 콘크리트로 안장되어서는 안됩니다. 그것이 참조에 유용한 유형 인 이유입니다.
Trixie Wolf

1
@TrixieWolf 기본 메소드를 사용하면 인터페이스가 발전 할 수 있습니다. 이전에는 클래스와 달리 메서드를 추가하면 모든 구현이 중단됩니다. 지금, 당신은 좋은 후보 기본값이있는 한 인터페이스를 성장시킬 수 있습니다. 의 추가 고려 stream에를 java.util.Collection, 또는 Map.getOrDefault(). 대안은 새로운 하위 인터페이스를 만들고 Graphics2D와 같이 모두 다운 캐스트하도록하는 것입니다.
SusanW

답변:


2

StackOverflow 답변을 확장하려면

  1. public액세스 한정자가 있기 때문에 필요하지 않습니다

    모든 메소드 선언인터페이스 본문의 은 암시 적으로 공개됩니다 (§6.6). 인터페이스에서 메소드 선언을 위해 public 수정자를 중복 지정하는 것은 허용되지만 스타일 문제로 권장되지 않습니다. ( 9.4 항 )

  2. abstract액세스 한정자가 있기 때문에 필요하지 않습니다

    기본 메소드는 기본 수정 자 와의 인터페이스에서 선언 된 메소드입니다 .그것의 은 항상 블록으로 표현됩니다 .

    과...

    기본 수정 자 또는 정적 수정 자가없는 인터페이스 방법 은 암시 적으로 추상입니다 이므로 해당 본문은 블록이 아니라 세미콜론으로 표시됩니다 .

기본 메소드 에는 본문이 있고 본질적으로 추상적이지 않은 메소드가 있으며 인터페이스의 모든 메소드 선언은 본질적으로 공개이므로 키워드를 지정할 필요가 없습니다.


답변에 대한 의견 중 하나가 말했습니다.

그들이 생각하게하지 마십시오! 나는 스타일 경찰에도 불구하고 항상 공개 초록을 추가하여 내용을 명확하게하고 독자에게 상기시켰다. 이제 Java 8 및 9가 복잡 해져서 입증되었습니다 (user949300).

StackOverflow 질문에 대한 의견 (18 번 투표)은 이것을 반박합니다.

공개로 작성하면 공개되지 않을 수 있기 때문에 나쁩니다 (Pacerier).

코드, 특히 인터페이스의 의미가 중요합니다.


StackOverflow에서 인용 한 주석이 이제 구식입니다. public 수정자를 추가하는 것은 비공식 일 수 있음을 암시하기 때문에 글쓰기가 잘못되었다고 말하는 것은 모순입니다. 이 방법은 비공개 일 수 있습니다.
David Campbell

@DavidCampbell : 글쎄, Java 9가 나온 후에이 질문이 더 나을 것이라고 생각합니다. :) 아직 완성되지 않은 Java 사양이이 질문에 대한 답이 될 수 있습니다.
Greg Burghardt

1

블록 구문의 부족이 충분하지 않습니까? 선언 하시겠습니까extends Object묵시적 ?

개발자가 중복성을 이해하지 못하면 언어 기능의 개념을 완전히 이해하지 못할 가능성이 높습니다 . 이는 수정 자에 대해 혼동하는 것보다 훨씬 큰 문제입니다.

개발자는 인터페이스의 목적이 클라이언트가 객체와 상호 작용할 수있는 방법을 정의하는 계약을 작성하는 것임을 이해해야합니다. 이것은 객체 상호 작용에 사용 되는 인터페이스의 모든 방법을 제안합니다. 가 클라이언트에 노출되어야 함 .

메소드를 private으로 선언하면 클라이언트가 메소드를 호출하지 않는다는 것을 명시 적으로 말하고 있습니다. 인터페이스의 경우 쉽게 추론 할 수없는 것입니다.


2
그들이 생각하게하지 마십시오! 나는 항상 public abstract스타일 경찰에도 불구하고 그것을 추가 하여 그것을 명확하게하고 독자에게 상기시켰다. Java 8과 9가 :-)를 복잡하게하기 때문에 입증되었습니다. 자바는 이미 많이 중복되어 있습니다.
user949300

1
@ user949300 또한 extends Object직접 파생되는 모든 클래스에 추가 하시겠습니까 Object? 개발자가 이미 알고 있어야하는 정보이므로 유추 된 것입니다. 화면에 쓸모없는 정보가 적을수록 중요한 정보를보다 쉽게 ​​처리 할 수 ​​있습니다. 잘만되면 나는 당신이 어두운면에 오도록 설득했습니다 (암시적인 것들을 볼 수 없게하십시오). 그렇지 않다면, 하하의 가치가있었습니다. 결국, 그것은 개발자를 위해 관리 코드 쉽게 무엇에 온다
빈스 Emigh

@ user949300 이렇게하면 인터페이스 메소드에 이러한 선언이 포함되지 않은 경우의 의미에 대해 혼동을 일으킬 가능성이 높습니다. 즉, 코드를 살펴보면서 자바를 배우는 개발자가 있다면 인터페이스 선언 구문에 대한 이해가 부족할 것입니다.
JimmyJames

빈스, 아니요, Object를 확장하지는 않지만 그렇게하는 코드를 볼 때 적합하지 않습니다. @JimmyJames, 항목에 공개 초록을 지속적으로 추가하면 혼란이 없습니다. 뭔가 빠졌습니까? OTOH, 난 당신의 혼란에 요점을 참조하십시오. 예를 들어, final익명의 내부 클래스 등과 같은 재미있는 무언가가 필요하지 않으면 메소드 인수 앞에 추가하지 않습니다.
user949300 0시 03 분

@ user949300 사용자가 이미 수정 자의 부족과 그 이유에 노출 된 경우 수정자가 자신을 볼 때 그 이유가 무엇인지에 대해 의문을 제기 할 수 있습니다. . 내가 본다면 적합하지 않을 extends Object것이지만, 분명히 깃발을 들고 왜 그런지 의심하게 만들 것입니다. 나는이 게시물에 언급 한 바와 같이, 같은 일을하는 것은 개발자가 (모든 객체가 이미 확장 것을 알 수 없습니다 얼마나 뭔가 작품의 오해가있을 수 있음을 의미 할 수 Object, 따라서 명시 적 확장)
빈스 Emigh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.