шукаючи конкретний випадок використання, коли і підклас, і клас в одному пакеті потребують доступу до захищеного поля чи методу ...
Ну для мене такий випадок використання є скоріше загальним, ніж конкретним, і випливає з моїх уподобань до:
- Почніть з максимально суворого модифікатора доступу, вдаючись до більш слабкого (і) лише пізніше, як вважаєте необхідним.
- Нехай одиничні тести проживають у тій же упаковці, що і тестований код.
Зверху я можу почати проектувати для своїх об'єктів модифікатори доступу за замовчуванням (я б почав з, 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
тільки підклас? Чесно кажучи, довгий час у мене було враження, що така поведінка