Java 인터페이스의 메서드는 공개 액세스 수정자를 포함하거나 포함하지 않고 선언되어야 하는가?
Java 인터페이스의 메서드를 다음 구성 요소와 함께 선언해야 함public
접근 수식어?
엄밀히 말하면 그건 물론 문제가 되지 않는다.를 구현하는 클래스 메서드interface
항상public
그러나 더 나은 관습은 무엇인가?
자바 자체는 이것에 있어서 일관성이 없다.예를 들어 참조하십시오.Collection
대Comparable
또는Future
대ScriptEngine
.
JLS는 다음과 같은 점을 명확히 한다.
스타일에 따라 다음 사항을 중복적으로 명시하는 것은 허용되지만, 기권한다.
public
및/또는abstract
인터페이스에 선언된 메서드의 수정자
(내 생각에는) 자바 인터페이스에서 공개 수식어를 생략해야 한다.
추가 정보를 추가하지 않기 때문에 중요한 것들로부터 주의를 끌 뿐이다.
대부분의 스타일 가이드는 빼라고 권고하겠지만, 물론 가장 중요한 것은 코드베이스 전체에 걸쳐, 특히 각 인터페이스에 대해 일관성을 유지하는 것이다.다음 예는 자바에 100% 유창하지 않은 사람을 쉽게 혼동할 수 있다.
public interface Foo{
public void MakeFoo();
void PerformBar();
}
이 질문이 오래 전에 제기되었지만 나는 포괄적인 설명이 왜 방법 앞에 공개 추상화를 사용할 필요가 없는지, 그리고 인터페이스의 상수 앞에 공개 정적 최종결론을 사용할 필요가 없는지 분명히 할 것이라고 생각한다.
먼저 모든 인터페이스는 모든 클래스가 고유한 구현을 갖는 관련 없는 클래스의 집합에 대한 공통 방법을 지정하는 데 사용된다.따라서 오버라이드할 다른 클래스에서 액세스할 수 없기 때문에 액세스 한정자를 비공개로 지정할 수 없다.
둘째로, 비록 인터페이스 유형의 개체를 시작할 수 있지만 인터페이스는 그것을 구현하는 클래스에 의해 실현되고 상속되지 않는다.그리고 인터페이스는 동일한 패키지에 없는 서로 무관한 다른 클래스에 의해 구현(실현)될 수 있으므로 보호되는 액세스 한정자 역시 유효하지 않다.그래서 접근 수식어에게 있어서 우리는 단지 대중의 선택만을 남겨두고 있다.
셋째, 인터페이스는 인스턴스(instance) 변수와 방법을 포함한 어떠한 데이터 구현도 하지 않는다.구현된 방법이나 인스턴스 변수를 인터페이스에 삽입해야 하는 논리적인 이유가 있다면 인터페이스가 아니라 상속 계층의 슈퍼클래스여야 한다.이 사실을 고려하면, 인터페이스에서는 어떤 방법도 구현될 수 없으므로 인터페이스의 모든 방법은 추상적이어야 한다.
넷째, 인터페이스는 상수를 데이터 구성원으로만 포함할 수 있으며, 이는 상수가 최종적이고 물론 최종 상수가 하나의 인스턴스만 유지하기 위해 정적인 것으로 선언된다는 것을 의미한다.따라서 정적 결승도 인터페이스 상수에 대한 필수 사항이다.
따라서 결론적으로, 방법 이전의 공개 추상적 사용과 인터페이스의 상수 이전에 공개 정적 최종 사용이 유효하지만, 다른 옵션이 없기 때문에 중복된 것으로 간주되고 사용되지 않는다.
의 소개로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() {}
}
나는 대중에게 공개하는 것은 다른 선택권이 있다는 것을 의미하므로 그것이 존재해서는 안 된다는 대중적인 대답에 동의하지 않는다.사실은 자바 9와 그 이상의 다른 선택사항들이 있다는 것이다.
대신 자바에서는 '공개'를 강제/요구해야 한다고 생각한다. 왜일까?왜냐하면 수식어가 없다는 것은 다른 곳에서도 '패키지' 접속을 의미하며, 이것을 특수한 경우로 하는 것이 혼란을 초래하기 때문이다.만약 당신이 명확한 메시지로 컴파일 오류(예: "인터페이스에서는 패키지 액세스가 허용되지 않는다")를 만들었다면, 우리는 '공개'를 배제하는 옵션이 도입하는 명백한 모호성을 없앨 것이다.
https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4에 현재 문구를 적어 두십시오.
"인터페이스 본문의 방법은 공개 또는 비공개(제6.6조)로 선언할 수 있다.액세스 한정자가 주어지지 않으면 방법은 암묵적으로 공개된다.방식 선언에 대한 공개 수식어를 인터페이스에 중복적으로 지정하는 것은 허용되지만 스타일의 문제로서 낙담된다."
지금 '개인용' IS가 허용되는지 확인하십시오.나는 마지막 문장이 JLS에서 삭제되었어야 했다고 생각한다."불확실하게 공개적인" 행동이 이제는 역호환성을 유지하게 될 것이고 접속 수식어가 없는 것이 인터페이스에서 '공용'을 의미하고 다른 곳에서는 '패키지'를 의미한다는 혼란으로 이어지게 될 것이기 때문에 결코 허용되지 않았던 것은 유감스러운 일이다.
인터페이스가 없고 직접 구현(즉, 사용)을 작성하는 경우 항상 사용하고자 하는 내용을 작성한다.public
.
나는 디폴트로 적용되는 수식어를 넣는 것을 피하겠다.지적했듯이 모순과 혼란을 초래할 수 있다.
내가 본 최악의 상황은 선언된 방법과의 인터페이스였다.abstract
...
에 대해 선언하는 방법을 사용했다.public
특히 구문 강조 표시와 함께 코드를 더 읽기 쉽게 만들기 때문에 수정자.그러나 최근 프로젝트에서는 Checkstyle을 사용했는데, Checkstyle은 다음과 같은 기본 구성으로 경고를 표시했다.public
인터페이스 방법의 수식어, 그래서 나는 Ommeting으로 바꾸었다.
그래서 뭐가 제일 좋은지는 잘 모르겠지만, 내가 정말 싫어하는 한 가지는 사용법이야.public abstract
는 ""로 때 이렇게 Eclipse는 "Extract Interface"로 리팩터링할 때 가끔 이렇게 한다.
인터페이스의 방법이 기본적으로 공개적이고 추상적인 이유는 내게 꽤 논리적이고 명백해 보인다.
인터페이스의 방법은 구현 클래스가 구현을 제공하도록 강제하는 것은 기본적으로 추상적이며, 구현 클래스가 그렇게 할 수 있도록 기본적으로 공개된다.
코드에 이러한 수식어를 추가하는 것은 불필요하고 불필요하며, Java 기본 원리에 대한 지식 및/또는 이해 부족이라는 결론만 초래할 수 있다.
그냥 건너뛰는 게 더 좋고, 인터페이스가 기본이라고 어딘가에서 읽었는데,public
그리고abstract
.
놀랍게도 헤드 퍼스트 디자인 패턴이public
인터페이스 선언 및 인터페이스 메서드를 사용하여...다시 한 번 생각하게 만들었고 난 이 자리에 올랐어
어쨌든, 나는 중복된 정보는 무시되어야 한다고 생각해.
전적으로 주관적이다.나는 중복되는 것을 생략한다.public
다른 된 바와 같이 수긍어 - 이 이 다른 사람들이 언급했듯이 일관성은 이 결정의 핵심이다.
C# 언어 디자이너들이 이것을 시행하기로 결정했다는 것은 흥미롭다.인터페이스 방법을 C#에서 공개로 선언하는 것은 사실 컴파일 오류다.하지만 언어에 걸쳐 일관성은 중요하지 않을 수 있기 때문에, 나는 이것이 자바와 직접적으로 관련이 없다고 생각한다.
사람들은 당신의 인터페이스를 출처를 읽는 것이 아니라 IDE나 Javadoc에서의 코드 완성으로부터 배울 것이다.그래서 "공개"를 출처에 넣는 것은 의미가 없다. 아무도 출처를 읽지 않는다.
'IT이야기' 카테고리의 다른 글
리눅스 c 프로그램에서 pthread의 스레드 ID를 얻는 방법? (0) | 2022.04.17 |
---|---|
Vue.createApp이 작동하지 않지만 새 Vue() 방법으로 작동 중임 (0) | 2022.04.17 |
Bootstrap-vue 테이블 _ showdetails는 데이터 업데이트 시 닫힘 (0) | 2022.04.17 |
Vuejs에서 어레이를 필터링할 때 문제가 발생하시겠습니까? (0) | 2022.04.17 |
시논j가 있는 스터빙부룩스 게터 (0) | 2022.04.17 |