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

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

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

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



답변

JLS는 이 명확하게 :

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


답변

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

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

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

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


답변

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

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

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

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

넷째, 인터페이스는 데이터 멤버로만 상수를 포함 할 수 있습니다. 즉, 멤버는 최종이어야하며 물론 하나의 인스턴스 만 유지하려면 최종 상수가 정적으로 선언됩니다. 따라서 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.