Java 인터페이스의 메소드는 공개 액세스 수정자를 사용하거나 사용하지 않고 선언해야합니까?


292

Java 인터페이스의 메소드는 public액세스 수정자를 사용하거나 사용하지 않고 선언해야합니까 ?

기술적으로는 중요하지 않습니다. 를 구현하는 클래스 메소드 interface는 항상 public입니다. 그러나 더 나은 협약은 무엇입니까?

Java 자체는 이것과 일치하지 않습니다. Collectionvs. Comparable또는 Futurevs.를 참조하십시오 ScriptEngine.


22
공개적으로 작성하는 것은 공개 되지 않을 있음을 의미하기 때문에
나쁩니다.

8
어떤 형태의 중복 구문도 피해야합니다.
Lorne의 후작

3
@Pacerier, 나는 public이 맥락에서 사용하는 것이 좋지 않다는 것에 동의하지만 기본 인터페이스 메소드 이제 (자바 9와 함께) 개인이 될 수 있습니다. 더 이상 사용되지 않으므로 댓글을 삭제하시기 바랍니다.
aioobe

2
예. Java 9에서는 상황이 변경 될 수 있습니다. "공개로 작성하면 공개 되지 않을있습니다" . 정확하게 때문에 자바 (9) 가능한 것 같다,이 인수는 참으로 작성하는의 이익에 지금있다 public.
MC 황제

답변:


334

JLS는 이 명확하게 :

인터페이스에서 선언 된 메소드에 대해 public및 / 또는 abstract수정자를 중복 지정하는 것은 허용되지만 스타일 문제로 권장되지 않습니다 .


6
위의 JLS 링크는 내가 읽을 당시 Java 7 용이었습니다. 비공개 메소드를 허용하는 Java 9에 대한 의견을 보낸 후 SE9 JLS에 대해 매우 유사한 문구가 여전히 존재 함을 확인하고 싶었습니다 . ( public부분은 동일, and/or abstract부분은 삭제)
OzgurH

3
여전히 사실 SE11 JLS
Ortomala Lokni


44

공개 수정자는 Java 인터페이스에서 생략해야합니다 (제 생각에는).

추가 정보를 추가하지 않으므로 중요한 정보에서주의를 끌기 만합니다.

대부분의 스타일 가이드는이를 생략 할 것을 권장하지만 물론 가장 중요한 것은 코드베이스 전체, 특히 각 인터페이스에 대해 일관성을 유지하는 것입니다. 다음 예제는 Java에 100 % 능숙하지 않은 사람을 쉽게 혼동 할 수 있습니다.

public interface Foo{
  public void MakeFoo();
  void PerformBar();
}

3
그러한 스타일 가이드에 대한 링크가 있습니까?
Benno Richters

9
일관성이 가장 중요하며 이러한 유형의 질문 중 99 %에 대한 답변입니다.
SCdF

합의 : 일관성. 코딩 표준 문서를위한 것 :)
JeeBee

2
Bno : 하나는 Java 언어 사양이고 다른 하나는 Checkstyle입니다.
Rasmus Faber

9

이 질문이 오래 전에 요청되었지만 사실에 대한 포괄적 인 설명은 왜 인터페이스의 상수 전에 퍼블릭 추상 최종 메소드를 사용할 필요가없고 퍼블릭 정적 최종을 사용할 필요가 없는지 명확하게 느낄 것입니다.

우선 모든 인터페이스는 모든 클래스가 고유하게 구현되는 관련되지 않은 클래스 세트에 대한 공통 메소드를 지정하는 데 사용됩니다. 따라서 액세스 클래스를 대체 할 다른 클래스에서 액세스 할 수 없으므로 액세스 수정자를 개인으로 지정할 수 없습니다.

둘째, 인터페이스 유형의 객체를 시작할 수 있지만 인터페이스를 구현하고 상속하지 않는 클래스에 의해 인터페이스가 구현됩니다. 또한 동일한 패키지에없는 다른 관련되지 않은 클래스에 의해 인터페이스가 구현 (구현) 될 수 있으므로 보호 된 액세스 수정 자도 유효하지 않습니다. 따라서 액세스 수정 자에 대해서는 공개적으로 선택해야합니다.

셋째, 인터페이스에는 인스턴스 변수 및 메소드를 포함한 데이터 구현이 없습니다. 인터페이스에 구현 된 메소드 또는 인스턴스 변수를 삽입해야하는 논리적 이유가있는 경우 인터페이스가 아니라 상속 계층 구조의 수퍼 클래스 여야합니다. 이 사실을 고려하면 인터페이스에서 메소드를 구현할 수 없으므로 인터페이스의 모든 메소드가 추상적이어야합니다.

넷째, 인터페이스는 데이터 멤버로만 상수를 포함 할 수 있습니다. 즉, 멤버는 최종이어야하며 물론 하나의 인스턴스 만 유지하려면 최종 상수가 정적으로 선언됩니다. 따라서 static final은 인터페이스 상수의 필수 요소입니다.

결론적으로 인터페이스의 상수 이전에 public abstract before 메소드와 public static final을 사용하더라도 유효하지만 다른 옵션이 없으므로 중복으로 간주되어 사용되지 않습니다.


7

의 도입으로 private, static, default자바 8/9의 인터페이스 방법에 대한 수정, 상황이 더 복잡하고 그 전체 선언 (자바 9 컴파일 할 필요가) 더 읽을 생각하는 경향이있다 :

public interface MyInterface {

    //minimal
    int CONST00 = 0;
    void method00();
    static void method01() {}
    default void method02() {}
    private static void method03() {}
    private void method04() {}

    //full
    public static final int CONST10 = 0;
    public abstract void method10();
    public static void method11() {}
    public default void method12() {}
    private static void method13() {}
    private void method14() {}

}

5

기본적으로 적용되는 수정자를 넣지 마십시오. 지적했듯이 불일치와 혼란을 초래할 수 있습니다.

내가 본 최악은 선언 된 메소드가있는 인터페이스입니다 abstract...


5

public특히 구문 강조 표시와 함께 코드를 더 읽기 쉽 도록 수정 자에 선언 메소드를 사용 했습니다. 최신 프로젝트에서는 public인터페이스 메소드의 수정 자에 대한 기본 구성과 함께 경고를 표시하는 Checkstyle을 사용 했기 때문에 생략했습니다.

그래서 가장 좋은 것이 무엇인지 확실하지 않지만, 정말로 마음에 들지 않는 것은 public abstract인터페이스 메소드를 사용 하는 것입니다 . Eclipse는 때때로 "추출 인터페이스"를 사용하여 리팩토링 할 때이를 수행합니다.


2
그러나 두 개의 확인란을 선택하는 경우에만 메소드를 공개, 추상으로 선언하십시오.
MetroidFan2002

4

인터페이스가없고 직접 구현을 작성하는 경우, 즉 사용하는 경우 항상 사용할 내용을 작성합니다 public.


6
또한 모든 인터페이스 메소드를 명시 적으로 선언 하시겠습니까?
Dan Dyer

4
추상 클래스가 아닌 인터페이스입니다. '공개'와 관련하여 생각할 때 입력 한 문자는 7 자입니다. 그리고 그것은 구현에서도 정의되는 방법입니다. 중복성을 위해 -1을 일관성 균형 조정하기 위해 +1입니다.
JeeBee

3

나는 인터페이스가 기본적으로 것을 어딘가에 읽고 그것을 건너 뛰는, 선호 publicabstract.

놀랍게도 Head First Design Patterns 라는 책 은 public인터페이스 선언 및 인터페이스 메소드와 함께 사용 하고 있습니다. 다시 한 번 다시 생각하게되었고이 포스트에 올랐습니다.

어쨌든 중복 정보는 무시해야한다고 생각합니다.


1
명확히하기 위해 public인터페이스 선언 에서 액세스 수정자를 생략하면 기본적으로 공개 및 요약 되지 않습니다 . docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
Jabbslad

3

대중의 대답은 다른 선택의 여지가 있다는 것을 암시하며 거기에 있어서는 안된다는 의견에 동의하지 않습니다. 사실 Java 9 이상에서는 다른 옵션이 있습니다.

대신 자바는 '공개'를 지정 / 요구해야한다고 생각합니다. 왜? 수정자가 없으면 다른 곳에서 '패키지'액세스를 의미하고이를 특수한 경우로 사용하는 것이 혼란을 초래합니다. 분명한 메시지 (예를 들어, "패키지 액세스는 인터페이스에서 허용되지 않습니다")와 함께 컴파일 오류로 만들었을 경우 'public'을 생략 할 수있는 옵션이있는 명백한 모호성을 제거 할 수 있습니다.

https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4 에서 현재 문구를 참고 하십시오.

"인터페이스 본문의 메소드는 public 또는 private (§6.6) 으로 선언 될 수 있습니다 . 액세스 수정자가 제공되지 않은 경우이 메소드는 암시 적으로 공개됩니다. 공용을 중복 지정하도록 허용되지만 스타일 문제로 권장되지 않습니다. 인터페이스에서 메소드 선언을위한 수정 자 "

'비공개'가 지금 허용되는지 확인하십시오. JLS에서 마지막 문장이 제거 된 것 같습니다. "암시 적으로 공개 된"동작이 이제 역 호환성을 위해 남아있을 가능성이 높고 액세스 수정 자의 부재가 인터페이스에서 '공개'를 의미하고 다른 곳에서는 '패키지'라는 혼동을 초래할 수 있기 때문에 불행히도 불행합니다.


2

인터페이스의 메소드가 기본적으로 공개적이고 추상적 인 이유는 상당히 논리적이며 명백합니다.

인터페이스의 메소드는 구현 클래스가 강제로 구현을 제공하고 기본적으로 공개되어 구현 클래스가 액세스 할 수 있도록하는 것이 기본적으로 추상입니다.

코드에 이러한 수정자를 추가하는 것은 불필요하며 쓸모가 없으며 Java 기초에 대한 지식 및 / 또는 이해가 부족하다는 결론으로 ​​이어질 수 있습니다.


그러나 추상 클래스에서 액세스를 보호하는 추상 메소드를 구현할 수도 있습니다. 따라서 공개는 요구 사항이 아닙니다. 기본값과 동일한 명시적인 것을 추가하는 것은 항상 중복되지만 항상 쓸모있는 것은 아닙니다.
swpalmer 19

그러나 문제는 인터페이스에 관한 것입니다. 나는 탈선하고 싶지 않았다. Java 8부터 인터페이스의 개인 및 기본 메소드에 대해서도 이야기 할 수 있습니다. 우리가 원한다면이 토론은 꽤 길어질 수 있습니다. ;)
Iuliana Cosmina

1

완전히 주관적입니다. public혼란스러워 보이는 것처럼 중복 수정자를 생략합니다 . 다른 사람들이 언급했듯이 일관성은이 결정의 핵심입니다.

C # 언어 디자이너가이를 시행하기로 결정했다는 것은 흥미로운 사실입니다. C #에서 공용으로 인터페이스 메소드를 선언하는 것은 실제로 컴파일 오류입니다. 일관성은 언어마다 중요하지 않을 수도 있으므로 Java와 직접적으로 관련이없는 것 같습니다.


-9

사람들은 소스를 읽지 않고 IDE 또는 Javadoc에서 코드 완성을 통해 인터페이스를 배우게됩니다. 따라서 소스에 "public"을 넣을 필요는 없습니다. 아무도 소스를 읽지 않습니다.


8
나는 아무도 소스를 읽지 않는다는 진술에 동의하지 않아야한다. 많은 사람들이 Eclipse에서 F3을 사용하여 코드를 확대한다고 생각합니다. Maven과 같은 도구는 JavaDoc뿐만 아니라 소스를 다운로드 할 수있는 옵션을 제공합니다.
Benno Richters

public인터페이스에 액세스 수정자를 추가하지 않은 정확한 이유는 아닙니다 . 그것은 의도적으로 설계되고 신중하게 생각한 후에입니다.
mtk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.