Digamos que eu tenha uma classe com alguns membros e os membros tenham um modificador de acesso menos restritivo do que a própria classe.
Um exemplo concreto pode ser:
package apples;
class A { // package private
public int foo() { // public (=> less restrictive than *package private*)
return 42;
}
}
Para meu entendimento, um modificador de acesso à classe que é mais restritivo do que o modificador de acesso ao membro , substituirá os modificadores de acesso ao membro menos restritivos . Portanto, um modificador de acesso a membros menos restritivo não deve ter efeito algum.
- Meu entendimento está correto?
- Se não, quais são as consequências?
- Quais seriam os motivos válidos para ter modificadores de acesso a membros menos restritivos?
- Finalmente, quais são as melhores práticas a seguir?
Também fiz algumas experiências porque achei que poderia ter consequências assim que começar a passar referências de funções, mas mesmo assim o modificador de acesso não parece importar.
A situação que eu construí é a seguinte:
apples.B
fornece um método públicobla()
que retorna uma referência aapples.A.foo
.- Em seguida,
pizzas.C
chamaapples.B.bla
para obter uma referênciaA.foo
e chama. - Portanto,
A.foo()
não é diretamente visívelC
, mas é indiretamente acessível viaB.bla()
Eu testei e não faz diferença se eu faço o modificador de acesso do foo()
pacote privado ou não.
package apples;
import java.util.function.IntSupplier;
public class B {
public IntSupplier getReferenceToAFoo() {
A aInstance = new A();
return aInstance::foo;
}
}
package pizzas;
import apples.B;
import java.util.function.IntSupplier;
public class C {
private int callAFooIndirectly() {
B bInstance = new B();
IntSupplier intsupplier = bInstance.getReferenceToAFoo();
return intsupplier.getAsInt();
}
public static void main(String[] args) {
C cInstance = new C();
int i = cInstance.callAFooIndirectly();
System.out.println(i);
assert 42 == i;
}
}
fonte
java.util.Collections.SingletonSet<E>
estáprivate
emjava.util.Collections
).Respostas:
Sim.
Duas razões:
public
public
, mesmo em uma classe privada de pacote, mais tarde tudo o que você precisa fazer para tornar a classe pública é adicionarpublic
à declaração de classe.Essa é uma questão de opinião, portanto, não é adequada para uma pergunta ou resposta do Stack Overflow. Faça o que lhe parecer razoável e / ou sua equipe e / ou faça o que o guia de estilo da sua equipe lhe disser.
fonte