una metodos instanciar dentro como clases clase anonimas anidar anidadas anidada java file external nested-class

java - metodos - clases dentro de una clase



Clase anidada/interna en el archivo externo (6)

Tengo una clase MyClass y una clase interna MyNestedClass así:

public class MyClass { ... public class MyNestedClass { ... } }

Ambas clases son muy largas. Por eso me gustaría separarlos en dos archivos diferentes, sin romper la jerarquía. Esto se debe a que la clase anidada no debe ser visible para el programador que usa MyClass.

¿Hay alguna manera de lograr eso?



Los objetos de las clases internas mantienen referencias implícitas a los objetos de la clase paren. Si la clase anidada no es static (es interna), no puede. Pero si la clase anidada no necesita acceder a las instancias de clases de los padres directamente y no necesita acceder a los campos privados, entonces debería estar bien para refactorizar, mover la clase interna y no declararla pública (de ese paquete no se puede ser accedido).


No. Los códigos fuente de Java no se pueden dividir en varios archivos. Necesitarías una construcción similar a una clase parcial como en C #, que Java no tiene.


Puede crear clases base abstractas que amplíe en ambas.

Sin embargo, si esas clases son grandes, es mejor que reevalúe el diseño de su clase y vea si puede refactorizar en clases que representen una preocupación para cada una.


Puede hacer que el paquete interno de la clase sea privado, lo que significa que solo será accesible desde otras clases en exactamente el mismo paquete. Esto también se hace con bastante frecuencia para las clases ocultas dentro de los paquetes estándar JDK como java.lang o java.util .

en pkg / MyClass.java

public class MyClass { ... }

en pkg / MyHiddenClass.java

class MyHiddenClass { final MyClass outer; MyHiddenClass( MyClass outer ) { this.outer = outer; } ... }

Ahora, cuando desee acceder a métodos o variables de la clase externa, debe agregarles un prefijo outer. pero obtienes esencialmente la misma funcionalidad que antes cuando la referencia a la instancia externa fue creada sintéticamente por el compilador.


Sí, usando cascade-jumper. Un puente de cascada es una clase interna abstracta y no estática que se define en cualquier otro lugar.

MyClass.java

public class MyClass { public abstract class CascadeJumper {} }

MyNestedClass.java

public class MyNestedClass extends MyClass.CascadeJumper { MyNestedClass(MyClass dollarOne) { dollarOne.super(); // yes, is possible! } }

Saludos