procurando um caso de uso específico em que uma subclasse e uma classe dentro do mesmo pacote precisem acessar um campo ou método protegido ...
Bem, para mim, esse caso de uso é mais geral do que específico e deriva das minhas preferências:
- Comece com o modificador de acesso o mais rigoroso possível, recorrendo a um (s) mais fraco (s) somente mais tarde, conforme necessário.
- Os testes de unidade residem no mesmo pacote que o código testado.
Acima, eu posso começar a projetar para meus objetos com modificadores de acesso padrão (eu começaria, private
mas isso complicaria o teste de unidade):
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 lateral no trecho acima, Unit1
, Unit2
e UnitTest
são aninhados dentro Example
de simplicidade de apresentação, mas em um projeto real, eu provavelmente teria essas classes em arquivos separados (e UnitTest
até mesmo em um diretório separado ).
Então, quando surgir uma necessidade, eu enfraqueceria o controle de acesso do padrão para 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();
}
}
}
Veja bem, eu posso manter o código de teste de unidade ExampleEvolved
inalterado devido ao acesso a métodos protegidos do mesmo pacote, mesmo que acessar objeto não seja uma subclasse .
Menos mudanças necessárias => modificação mais segura; afinal, mudei apenas os modificadores de acesso e não modifiquei os métodos Unit1.doSomething()
e o que Unit2.doSomething()
faço, por isso é natural esperar que o código de teste de unidade continue sendo executado sem modificações.
protected
é apenas subclasse? Honestamente, há muito tempo, eu estava sob a impressão de que esse é o comportamento