buscando un caso de uso específico en el que tanto una subclase como una clase dentro del mismo paquete necesiten acceder a un campo o método protegido ...
Bueno, para mí, este caso de uso es más general que específico, y se deriva de mis preferencias para:
- Comience con un modificador de acceso lo más estricto posible, recurriendo a uno o más débiles solo más tarde, según se considere necesario.
- Haga que las pruebas unitarias residan en el mismo paquete que el código probado.
Desde arriba, puedo comenzar a diseñar mis objetos con modificadores de acceso predeterminados (comenzaría con, private
pero eso complicaría las pruebas unitarias):
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 al margen en el fragmento anterior Unit1
, Unit2
y UnitTest
están anidados dentro Example
para simplificar la presentación, pero en un proyecto real, probablemente tendría estas clases en archivos separados (e UnitTest
incluso en un directorio separado ).
Luego, cuando surja una necesidad, debilitaría el control de acceso de forma predeterminada 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();
}
}
}
Verá, puedo mantener el código de prueba de la unidad ExampleEvolved
sin cambios debido a que los métodos protegidos son accesibles desde el mismo paquete, a pesar de que acceder al objeto no es una subclase .
Se necesitan menos cambios => modificación más segura; después de todo, cambié solo los modificadores de acceso y no modifiqué qué métodos Unit1.doSomething()
y Unit2.doSomething()
qué hago, por lo que es natural esperar que el código de prueba de la unidad continúe ejecutándose sin modificaciones.
protected
es solo una subclase? Honestamente, durante mucho tiempo, tuve la impresión de que ese era el comportamiento