동일한 패키지 내의 서브 클래스와 클래스 모두 보호 된 필드 나 메소드에 액세스해야하는 특정 사용 사례를 찾고 있습니다.
나에게, 그러한 유스 케이스는 특정 것보다 일반적이며, 내 선호도에서 비롯됩니다.
- 필요에 따라 나중에 더 약한 것을 사용하여 가능한 한 엄격한 액세스 수정 자로 시작하십시오.
- 단위 테스트는 테스트 코드와 동일한 패키지에 있습니다.
위에서부터 기본 액세스 수정자를 사용하여 객체 디자인을 시작할 수 있습니다 (시작 private
하지만 단위 테스트가 복잡합니다).
public class Example {
public static void main(String [] args) {
new UnitTest().testDoSomething(new Unit1(), new Unit2());
}
static class Unit1 {
void doSomething() {} // default access
}
static class Unit2 {
void doSomething() {} // default access
}
static class UnitTest {
void testDoSomething(Unit1 unit1, Unit2 unit2) {
unit1.doSomething();
unit2.doSomething();
}
}
}
사이드 노트는 위의 코드에서, Unit1
, Unit2
하고 UnitTest
있다 중첩 내에서 Example
프리젠 테이션의 편의를 위해,하지만 실제 프로젝트에서, 나는 가능성이 별도의 파일 (그리고 이러한 클래스를했을 UnitTest
경우에도 별도의 디렉토리에 ).
그런 다음, 필연적으로 필요한 경우 액세스 제어를 기본값에서 protected
다음과 같이 약화시킵니다 .
public class ExampleEvolved {
public static void main(String [] args) {
new UnitTest().testDoSomething(new Unit1(), new Unit2());
}
static class Unit1 {
protected void doSomething() {} // made protected
}
static class Unit2 {
protected void doSomething() {} // made protected
}
static class UnitTest {
// ---> no changes needed although UnitTest doesn't subclass
// ...and, hey, if I'd have to subclass... which one of Unit1, Unit2?
void testDoSomething(Unit1 unit1, Unit2 unit2) {
unit1.doSomething();
unit2.doSomething();
}
}
}
ExampleEvolved
객체 액세스가 하위 클래스 가 아니더라도 동일한 패키지에서 보호 된 메소드에 액세스 할 수 있기 때문에 단위 테스트 코드를 변경하지 않고 유지할 수 있습니다 .
적은 변경이 필요합니다 => 더 안전한 수정; 결국 액세스 수정 자 만 변경하고 어떤 메소드 Unit1.doSomething()
와 방법을 수정하지 않았 Unit2.doSomething()
으므로 단위 테스트 코드가 수정없이 계속 실행될 것으로 기대하는 것은 당연합니다.
protected
서브 클래스 만 있다면 더 간단하지 않습니까? 솔직히 오랫동안, 나는 그것이 그 행동이라는 인상을