parameter - this in java programming
Constructor público de una clase privada (2)
No parece haber ningún caso de uso real para modificadores públicos o protegidos con clases privadas. Si tiene varias clases en un solo archivo (pero no está anidado o es local), necesita constructores no privados para crear instancias de las clases privadas.
// X.java
public class X {
private Y y = new Y();
}
class Y {
Y () {
// if this were private, X wouldn''t be able to create an instance of Y
}
}
En realidad, la visibilidad predeterminada o protected
sería suficiente para crear una instancia en este caso. Todos los modificadores no privados le permiten crear instancias de otras clases dentro del mismo paquete, pero prácticamente tienen la misma visibilidad.
- La clase privada no es visible para las clases fuera del paquete, por lo que
public
métodospublic
no tienen uso aquí. - La clase privada no puede extenderse por clases fuera del paquete, por lo que la
protected
tampoco tiene ningún uso. - Incluso cuando se utilizan reflexiones, un constructor público no es accesible de forma predeterminada desde otros paquetes y lanzará una
IllegalAccessException
. Verifica primero la visibilidad de la clase, luego la visibilidad del miembro.
El modificador predeterminado es el modificador más restrictivo que le permite llamar directamente al constructor desde otras clases, por lo que el paquete-privado parece ser la visibilidad más apropiada para el constructor y también cualquier otro método no privado. Esto también tiene la ventaja de que si cambia la visibilidad de la clase en el futuro, no expone accidentalmente el constructor o cualquier método al público.
Esta pregunta ya tiene una respuesta aquí:
Soy nuevo en Java. Quiero saber de qué se trata el uso de un constructor público en una clase privada . La clase privada dentro de la clase se puede inicializar desde la misma clase, entonces, ¿de qué sirve hacer público al constructor de la clase privada?
public class MainActivity extends Activity {
private class AcceptThread extends Thread {
public AcceptThread() {
}
}
}
Sabes, me hago esta pregunta casi cada vez que hago una clase interna privada, pero siempre asumí que podría haber alguna razón (posiblemente inventada) para un constructor público. Así que la respuesta de @kapep me hizo sentir un hormigueo y me animó a encontrar formas de requerir un constructor público en una clase interna privada, pero mientras más pienso y experimento con él, más creo que se tapan los agujeros.
Posibles ángulos, todos los cuales me fallaron:
Serialización: cuando se desmarca un objeto cuya superclase no es serializable, la superclase necesita un constructor sin argumentos accesible desde la subclase . Por lo tanto,protected
siempre debería ser suficiente aquí.Herramientas reflexivas: código que utiliza la reflexión para obtener el constructor de la clase interna a través de una instancia devuelta. Falla porque la visibilidad de tipo se verifica primero, como señaló @kapep, aunque deja un mensaje de error bastante interesante:Excepción en el hilo "main" java.lang.IllegalAccessException: La clase A no puede acceder a un miembro de la clase creada. $ C con modificadores "public"
Shenanigans de extensión de clase interna: No intentes esto en casa:package a; class Outer { private class Inner { } } package b; // compile error: Outer.Inner has private access in Outer class Extender extends a.Outer.Inner { Extender(a.Outer outer) { outer.super(); } }
Parecía prometedor al principio, pero no llegué demasiado lejos con eso.
Al final, no pude encontrar una manera de hacer útil a un constructor público en una clase interna privada.
Entonces, ¿por qué esto es técnicamente legal a pesar de no tener ningún uso? Probablemente porque el compilador inserta automáticamente un constructor público sin argumentos cuando no se proporciona ningún otro constructor. Por lo tanto, el lenguaje no debe rechazar estas construcciones. Aunque es más un artefacto que una razón.