alla ricerca di un caso d'uso specifico in cui sia una sottoclasse che una classe all'interno dello stesso pacchetto devono accedere a un campo o metodo protetto ...
Bene per me, un tale caso d'uso è piuttosto generale che specifico e deriva dalle mie preferenze per:
- Inizia con il più rigoroso modificatore di accesso possibile, ricorrendo a uno o più deboli solo in seguito, se ritenuto necessario.
- I test unitari devono risiedere nello stesso pacchetto del codice testato.
Da sopra, posso iniziare a progettare i miei oggetti con modificatori di accesso predefiniti (vorrei iniziare private
ma ciò complicherebbe il test unitario):
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();
}
}
}
Nota a margine nello snippet sopra Unit1
, Unit2
e UnitTest
sono nidificati all'interno Example
per semplicità di presentazione, ma in un progetto reale, probabilmente avrei queste classi in file separati (e UnitTest
persino in una directory separata ).
Quindi, quando si presenta una necessità, indebolirei il controllo degli accessi dal default a 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();
}
}
}
Vedete, posso mantenere ExampleEvolved
invariato il codice unit test a causa dell'accessibilità dei metodi protetti dallo stesso pacchetto, anche se l'accesso all'oggetto non è una sottoclasse .
Meno cambiamenti necessari => modifica più sicura; dopo tutto ho cambiato solo i modificatori di accesso e non ho modificato quali metodi Unit1.doSomething()
e Unit2.doSomething()
cosa fare, quindi è naturale aspettarsi che il codice unit test continui a funzionare senza modifiche.
protected
fosse solo una sottoclasse? Onestamente, per molto tempo, ho avuto l'impressione che questo sia il comportamento