클래스 액세스 수정 자보다 덜 제한적인 멤버 액세스 수정자를 사용하는 것은 무엇입니까?


9

멤버가있는 클래스가 있고 멤버 자체가 클래스 자체보다 덜 제한적인 액세스 수정자를 가지고 있다고 가정 해보십시오.

구체적인 예는 다음과 같습니다.

package apples;

class A { // package private
    public int foo() { // public (=> less restrictive than *package private*)
        return 42;
    }
}

멤버 액세스 수정 자 보다 더 제한적인 클래스 액세스 수정자를 이해 하면 덜 제한적인 멤버 액세스 수정자를 재정의합니다 . 따라서 덜 제한적인 멤버 액세스 수정자는 전혀 영향을 미치지 않습니다.

  • 이해가 정확합니까?
    • 그렇지 않은 경우 결과는 무엇입니까?
  • 덜 제한적인 멤버 액세스 수정자를 갖는 유효한 이유는 무엇입니까?
  • 마지막으로 따라야 할 모범 사례 는 무엇 입니까?

함수 참조를 전달하기 시작하면 결과가 발생할 수 있다고 생각했기 때문에 실험도했지만 액세스 수정자는 중요하지 않습니다.

내가 구성한 상황은 다음과 같습니다.

  • apples.B 공개 방법을 제공합니다 bla() 참조를 반환 를apples.A.foo .
  • 그때 pizzas.Capples.B.bla 참조를 얻기 위해 호출 하여 A.foo호출합니다.
  • 그래서 A.foo() 에 직접 표시되지 C않지만 다음을 통해 간접적으로 만 액세스 할 수 있습니다.B.bla()

나는 그것을 테스트했으며 foo() 패키지 의 액세스 수정자를 개인용으로 만들지 여부에 차이가 없습니다.

package apples;

import java.util.function.IntSupplier;

public class B {
    public IntSupplier getReferenceToAFoo() {
        A aInstance = new A();
        return aInstance::foo;
    }
}
package pizzas;

import apples.B;

import java.util.function.IntSupplier;

public class C {
    private int callAFooIndirectly() {
        B bInstance = new B();
        IntSupplier intsupplier = bInstance.getReferenceToAFoo();
        return intsupplier.getAsInt();
    }

    public static void main(String[] args) {
        C cInstance = new C();

        int i = cInstance.callAFooIndirectly();
        System.out.println(i);
        assert 42 == i;
    }
}

2
이러한 종류의 디자인에 대한 가장 일반적인 이유는 공용 클래스가 아닌 공용 API 메서드 (인터페이스 또는 확장 된 추상 클래스의 메서드)를 구현하는 것입니다. (예 : JDK를 자체는 클래스들로 가득 java.util.Collections.SingletonSet<E>하다 private에서 java.util.Collections).
ernest_k

답변:


8

이해가 정확합니까?

예.

덜 제한적인 멤버 액세스 수정자를 갖는 유효한 이유는 무엇입니까?

두 가지 이유 :

  • 때로는 인터페이스를 구현하고 있습니다. 인터페이스 방법은public
  • 수업의 전반적인 접근을보다 쉽게 ​​변경할 수 있습니다. 예를 들어 publicpackage-private 클래스에서도 public하려는 모든 메서드를 표시하면 나중에 클래스를 public으로 만들기 위해 수행해야 할 모든 작업 public이 클래스 선언에 추가 됩니다.

마지막으로 따라야 할 모범 사례는 무엇입니까?

그것은 의견의 문제이므로 스택 오버플로 질문이나 답변에 적합하지 않습니다. 귀하 및 / 또는 팀에 합리적으로 보이는 것을 수행하거나 팀의 스타일 가이드가 지시하는 것을 수행하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.