寻找一个特定的用例,其中同一包中的子类和类都需要访问受保护的字段或方法...
对我来说,这样的用例不是一般的,而是特定的,它源于我的偏好:
- 从尽可能严格的访问修饰符开始,仅在认为有必要时才使用较弱的访问修饰符。
- 单元测试是否与测试代码位于同一程序包中。
从上面开始,我可以使用默认的访问修饰符开始为我的对象进行设计(我将从开始,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
仅是子类,会不会更简单?老实说,很长一段时间以来,我的印象就是这种行为