looking for a specific use case where both a subclass and a class within the same package needs to access a protected field or method...
Per me, un caso d'uso di questo tipo è 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 più tardi, se necessario.
- I test unitari si trovano nello stesso pacchetto del codice testato.
Da sopra, posso iniziare a progettare i miei oggetti con modificatori di accesso predefiniti (vorrei iniziare con private
ma ciò complicherebbe il test delle unità):
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 laterale in snippet sopra, Unit1
, Unit2
e UnitTest
sono nidificato in Example
per semplicità di presentazione, ma in un progetto reale, probabilmente avrei queste classi in file separati (e UnitTest
anche in una directory separata ).
Quindi, quando sorge una necessità, indebolire il controllo degli accessi da predefinito 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 il codice del test unitario in ExampleEvolved
invariato a causa dei metodi protetti accessibili dallo stesso pacchetto, anche se l'accesso all'oggetto è non una sottoclasse .
Meno modifiche necessarie = > modifica più sicura; dopotutto ho modificato solo i modificatori di accesso e non ho modificato i metodi Unit1.doSomething()
e Unit2.doSomething()
, quindi è normale aspettarsi che il codice di prova dell'unità continui a funzionare senza modifiche.