2012-06-22 2 views
1

정의 된 클래스를 상속받지 않는 클래스가 보호 된 메서드에 액세스 할 수 있다는 사실은 항상 나를 귀찮게했습니다. 서브 클래스가 기능의 일부를 정의 할 수 있도록 추상 클래스에서 추상 보호 메소드를 사용합니다. 실제로 이것은 private 메소드입니다. 클래스 계층 구조 외부에서 호출되는 것은 아닙니다. 그러나 Java는 패키지의 모든 클래스에서 보호 된 메서드를 호출 할 수 있으므로이 말을 전달하지 않습니다.비 - 하위 클래스에서 Java로 보호 된 메서드에 액세스 할 충분한 이유가 있습니까?

제 질문은 이것을 허용하는 디자인 근거가 무엇입니까? 패키지 또는 패키지 외부의 무작위 하위 클래스에서만 호출 할 수있는 메소드를 필요로하는 유효한 유스 케이스가 있습니까? 나는이 사건을 본 적이 없으며 다른 이들이 있는지 궁금해하고 있습니다.

+1

가능한 복제본 [Java의 "protected"한정자가 같은 패키지의 다른 클래스에 대한 액세스를 허용하는 이유는 무엇입니까?] (http://stackoverflow.com/questions/902922/why-does-the-protected-modifier-in -java-allow-other-classes-in-same) –

답변

0

이 문제에 대한 해결책은 여러 패키지를 포함하도록 프로젝트를 재구성하는 것과 같으며 각 패키지에는 수퍼 클래스와 하위 클래스가 있습니다. 어렵고 빠른 솔루션보다 해결 방법이 더 많지만 원하는 작업을 수행해야합니다.

1

테스트 클래스가 테스트중인 클래스에서 내부 메소드를 호출하는 것은 매우 일반적이며, 보호 또는 패키지 레벨 액세스는이를 허용합니다.

내 생각에 protected 수정자는 코드 캡슐화를위한 강제 메커니즘보다 더 많은 기능입니다. 메소드 또는 필드를 보호 된 것으로 표시함으로써 다른 개발자에게 해당 코드가 해당 클래스의 공개 API가 아닌 향후 버전에서 변경 될 수있는 내부 구현 세부 사항임을 나타냅니다.

캐스팅과 리플렉션을 통해 다른 개발자가 의도하지 않은 코드를 자주 얻을 수 있습니다. 다른 클래스에서 호출 할 때 메서드 호출이 잠재적으로 위험한 경우 솔루션은 Java의 액세스 규칙을 사용하여 메서드를 잠그는 것이 아닙니다. 클래스를 수정하여 불변의 데이터 구조와 관심사의 명확한 분리를 선호합니다.