Digamos que tengo una clase con algunos miembros, y los miembros tienen un modificador de acceso menos restrictivo que la clase misma.
Un ejemplo concreto podría ser:
package apples;
class A { // package private
public int foo() { // public (=> less restrictive than *package private*)
return 42;
}
}
Según tengo entendido, un modificador de acceso de clase que es más restrictivo que el modificador de acceso de miembro , anulará los modificadores de acceso de miembro menos restrictivos . Por lo tanto, un modificador de acceso de miembros menos restrictivo no debería tener ningún efecto.
- ¿Es correcto mi entendimiento?
- Si no, ¿cuáles son las consecuencias?
- ¿Cuáles podrían ser razones válidas para tener modificadores de acceso de miembros menos restrictivos?
- Finalmente, ¿cuáles son las mejores prácticas a seguir?
También experimenté un poco porque pensé que podría tener consecuencias una vez que comience a pasar referencias de funciones, sin embargo, incluso entonces el modificador de acceso no parece importar.
La situación que construí es la siguiente:
apples.B
proporciona un método públicobla()
que devuelve una referencia aapples.A.foo
.- Luego
pizzas.C
llamaapples.B.bla
para obtener una referenciaA.foo
y lo llama. - Por
A.foo()
lo tanto, no es directamente visible paraC
, pero solo es indirectamente accesible a través deB.bla()
Lo probé y no hace ninguna diferencia si hago que el modificador de acceso del foo()
paquete sea privado o no.
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;
}
}
fuente
java.util.Collections.SingletonSet<E>
estáprivate
enjava.util.Collections
).Respuestas:
Si.
Dos razones:
public
public
, incluso en una clase de paquete privado, entonces todo lo que tiene que hacer para hacer que la clase sea pública es agregarpublic
a la declaración de clase.Esa es una cuestión de opinión, por lo que no es adecuada para una pregunta o respuesta de Stack Overflow. Haga lo que le parezca razonable a usted y / o su equipo, y / o haga lo que la guía de estilo de su equipo le dice que haga.
fuente