IT

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

lottoking 2020. 3. 21. 10:47

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


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

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

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


JLS는 이 명확하게 :

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


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

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

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

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

이 질문은 오래 전에 요청되었지만 사실에 대해 설명하기 전에 public abstract final 메서드를 사용할 필요가없는 이유와 인터페이스의 상수를 사용하기 전에 public static final을 사용할 필요가없는 이유를 명확하게 설명 할 것입니다.

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

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

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

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

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


의 도입으로 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() {}

}

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

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


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

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


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


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

놀랍게도 Head First Design Patterns 라는 책 public인터페이스 선언 및 인터페이스 방법과 함께 사용 하고 있습니다.

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


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

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

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

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

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


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

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

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


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

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


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

참고 : https://stackoverflow.com/questions/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m