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


public 액세스 수식 자의 유무에 관계없이 Java 인터페이스의 메소드를 선언해야합니까?

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

Java 자체는 일관성이 없습니다. 예를 들어 CollectionComparable 또는 Future vs. ScriptEngine 참조하십시오.




Answers


JLS 는 이것을 분명히합니다 :

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




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

추가 정보를 추가하지 않으므로 중요한 정보로부터주의를 끕니다.

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

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



이 질문은 오랜 전에 제기되었지만 인터페이스의 상수 앞에 메서드와 public static final 앞에 public abstract을 사용할 필요가없는 이유를 포괄적 인 설명으로 설명 할 수 있다고 생각합니다.

우선, 인터페이스는, 모든 클래스가 일의의 구현을 가지는 관련이없는 클래스 세트의 공통 메소드를 지정하기 위해서 사용됩니다. 따라서 액세스 한정자는 다른 클래스에서 재정의 할 수 없으므로 private로 지정할 수 없습니다.

둘째, 인터페이스 유형의 객체를 초기화 할 수는 있지만 인터페이스는 구현되고 상속되지 않는 클래스에 의해 구현됩니다. 그리고 인터페이스는 동일한 패키지에없는 서로 다른 비 관련 클래스에 의해 구현 (구현) 될 수 있으므로 보호 된 접근 수정자는 유효하지 않습니다. 따라서 액세스 한정자에 대해서는 공개 선택 만 남았습니다.

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

넷째, 인터페이스는 데이터 멤버로서 상수를 포함 할 수 있습니다. 즉, 반드시 최종적이어야하며 최종 상수는 단지 하나의 인스턴스 만 유지하기 위해 정적으로 선언됩니다. 따라서 static final 또한 인터페이스 상수에 필수적입니다.

결론적으로 인터페이스 이전의 public abstract final은 인터페이스의 상수 앞에 유효하지만 다른 옵션은 없기 때문에 중복되거나 사용되지 않는 것으로 간주됩니다.




public 수정자를 사용하여 선언 메소드를 사용했습니다. 특히 구문 강조 표시를 사용하면 코드를보다 쉽게 ​​읽을 수 있습니다. 우리의 최근 프로젝트에서 인터페이스 메소드의 public 수정 자에 대한 기본 구성으로 경고를 표시하는 Checkstyle을 사용 했으므로 생략했습니다.

그래서 나는 무엇이 최선인지 잘 모르겠지만, 내가 싫어하는 한 가지 방법은 인터페이스 메소드에 public abstract 을 사용하는 것입니다. Eclipse는 "Extract Interface"로 리팩터링 할 때 때로 이것을 수행합니다.




나는 인터페이스가없고 직접 구현을 작성한다면 공용을 사용할 것이라고 항상 쓸 것이다.




기본적으로 적용되는 수정자를 넣지 않아도됩니다. 지적했듯이, 불일치와 혼란을 야기 할 수 있습니다.

내가 본 최악의 경우 abstract 메소드 선언 인터페이스 ...




기본적으로 public과 abstract로 사용되는 인터페이스에서 메소드를 사용하는 이유는 나에게 상당히 논리적이고 명백한 것처럼 보입니다.

인터페이스의 메소드는, 구현 클래스가 구현을 제공하도록 (듯이) 강제적으로 실시하는 디폴트는 abstract입니다. 디폴트에서는 public가되어 구현 클래스는 액세스 할 수 있습니다.

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




나는 그것을 건너 뛰는 것을 선호한다. 나는 인터페이스가 기본적으로 public 되고 abstract 이라는 것을 읽었다.

놀랍게도 Head First Design Patterns 는 인터페이스 선언과 인터페이스 메소드를 public 으로 사용하고 있습니다. 다시 한 번 생각해 보았습니다.이 포스트에 착수했습니다.

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




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

C # 언어 디자이너가이를 적용하기로 결정한 점은 흥미 롭습니다. C #에서 공용 인터페이스 메서드를 public으로 선언하는 것은 실제로 컴파일 오류입니다. 일관성은 아마도 언어별로 중요하지 않으므로 자바와 직접적인 관련이 없다고 생각합니다.




Java 8/9의 인터페이스 메소드에 대한 private , static , default 수정 자의 도입으로 상황이 더 복잡 해지고 완전한 선언이 더 읽기 쉽다고 생각하는 경향이 있습니다 (Java 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() {}

}



사람들은 IDE 나 Javadoc에서 소스를 읽지 않고 코드 완성을 통해 인터페이스를 배울 것입니다. 따라서 소스에 "공개"를 두는 것은 아무런 소용이 없습니다. 아무도 소스를 읽지 않습니다.