문제

한 방법 Java 인터페이스에서 선언과 함께 또는없이 public 액세스 modifier?

기술적으로 중요하지 않은 물론이다.클래스 메소드를 구현하는 interfacepublic.하지만 더 나은 컨벤션?

자바 자체가 일관되지 않습니다.인스턴스에 대한 참조 CollectionComparable, 나 FutureScriptEngine.

도움이 되었습니까?

해결책

그만큼 JLS 이것을 명확하게 만듭니다 :

허용되지만 스타일의 문제로 낙담하며 중복적으로 public 및/또는 abstract 인터페이스에서 선언 된 메소드에 대한 수정 자.

다른 팁

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

추가 정보를 추가하지 않기 때문에 중요한 것들로부터주의를 기울입니다.

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

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

이 질문이 오래 전에 질문을 받았다는 사실에도 불구하고, 나는 포괄적 인 설명으로 인해 인터페이스의 상수 이전에 방법과 공개 정적 최종을 사용하기 전에 공개 초록을 사용할 필요가없는 이유를 분명히 할 것입니다.

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

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

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

넷째, 인터페이스는 데이터 구성원으로 만 상수를 포함 할 수 있습니다. 이는 최종적이어야하며 물론 최종 상수는 하나의 인스턴스 만 유지하기 위해 정적으로 선언됩니다. 따라서 정적 최종은 인터페이스 상수에 대한 필수입니다.

따라서 결론적으로, 인터페이스의 상수가 유효하지 않지만 다른 옵션이 없기 때문에 공개 초록을 사용하기 전에 공개 초록을 사용하지만 다른 옵션이 없기 때문에 중복으로 간주되고 사용되지 않습니다.

소개와 함께 private, static, default Java 8/9의 인터페이스 방법을위한 수정자는 상황이 더 복잡해지고 전체 선언이 더 읽기 쉬운 것으로 생각하는 경향이 있습니다 (컴파일해야 할 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() {}

}

기본적으로 적용되는 수정자를 배치하지 않습니다. 지적했듯이, 그것은 불일치와 혼란을 초래할 수 있습니다.

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

나는 선언 방법을 사용했습니다 public 수정자는 코드를 더 읽기 쉽게 만들기 때문에 특히 구문 강조 표시를 사용합니다. 그러나 최신 프로젝트에서는 기본 구성으로 경고를 표시하는 CheckStyle을 사용했습니다. public 인터페이스 메소드의 수정 자이므로 OMMITTING으로 전환했습니다.

그래서 나는 정말로 가장 좋은 것이 확실하지 않지만 내가 정말로 좋아하지 않는 한 가지는 사용하는 것입니다. public abstract 인터페이스 메소드에서. Eclipse는 때때로 "Extract Interface"로 리팩토링 할 때이 작업을 수행합니다.

인터페이스가 없으면 항상 내가 사용할 것을 작성하고 직접 구현을 작성하고있었습니다. 즉, 나는 사용할 것입니다. public.

나는 그것을 건너 뛰는 것을 선호하고, 인터페이스가 기본적으로 어딘가에서 읽었습니다. public 그리고 abstract.

놀랍게도 책은 - 첫 번째 디자인 패턴을 헤드하십시오, 사용 중입니다 public 인터페이스 선언 및 인터페이스 방법으로 ... 다시 한 번 다시 생각하게 만들었고이 게시물에 착륙했습니다.

어쨌든, 나는 중복 정보가 무시되어야한다고 생각합니다.

나는 대중의 대답에 동의하지 않습니다. 사실 Java 9와 그 너머에는 다른 옵션이 있습니다.

대신 Java는 '공개'를 시행/요구해야한다고 생각합니다. 왜요? 수정자가없는 것은 다른 곳에서 '패키지'액세스를 의미하며,이를 특별한 경우로 갖는 것이 혼란으로 이어지는 것입니다. 간단히 간단히 사용하면 명확한 메시지 (예 : "패키지 액세스가 인터페이스에서 허용되지 않습니다.") '공개'소개를 남기는 옵션이있는 명백한 모호성을 제거합니다.

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

"인터페이스 본문의 방법이 선언 될 수 있습니다. 공공의 또는 사적인 (§6.6). 액세스 수정자가 제공되지 않으면이 방법은 암시 적으로 공개됩니다. 인터페이스에서 메소드 선언에 대한 공개 수정자를 중복적으로 지정하는 것은 허용되지만 스타일의 문제로 권장되지 않습니다. "

이제 '개인'이 허용됩니다. 마지막 문장은 JLS에서 제거되었을 것이라고 생각합니다. 불행히도 불행히도 불행히도 불행히도 불행히도, "암시 적으로 공개 된"행동은 이제 뒤로 호환성을 유지하고 액세스 수정자가없는 것이 인터페이스와 다른 곳에서 '패키지'를 의미한다는 혼란으로 이어질 수 있기 때문에 불행한 일이다.

이유는 방법을 위해서 인터페이스는 기본적으로 공개하고 추상적인 것 같다 매우 논리적이고 분명하다.

방법 인터페이스에 그것은 기본적으로 추상을 강제로 구현하는 클래스를 구현을 제공하고 공공기 때문에 기본적으로 구현하는 클래스에 액세스할 수 있다.

추가 사람들에 수정 당신의 코드의 중복 및 쓸모 없는고로 이어질 수 있습는 결론을 지식이 부족 및/또는 이해하는 자바의 기본이다.

완전히 주관적입니다. 나는 중복을 생략한다 public 혼란처럼 보이는 수정 자. 다른 사람이 언급했듯이 일관성은이 결정의 열쇠입니다.

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

사람들은 소스를 읽는 것이 아니라 IDE 또는 Javadoc에서 코드 완료에서 인터페이스를 배우게됩니다. 따라서 소스에 "공개"를 두는 데 아무런 의미가 없습니다. 아무도 소스를 읽지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top