2009-11-23 22 views
9

Me encontré con estas preguntas en una de las pruebas de Java en línea. Las opciones fueron 4,5,8 y cualquier cantidad de veces.¿Cuántas veces se pueden anidar las clases dentro de una clase?

Solo he usado una clase interna, pero nunca he probado varias. Me preguntaba si alguien sabe la respuesta.

+0

@Kevin Bourrillion - Estaba tratando de entender si había un límite definido. Intenté 9 clases internas. –

+0

Me pregunto, ¿quién escribió esa prueba Java en línea? ¿Es realmente una cosa que el desarrollador debería cuidar cuando estudia Java? – incarnate

Respuesta

4

Lo intenté por mi cuenta: la respuesta es cualquier número de veces. La siguiente es mi clase de prueba, no tuve errores de compilación.

 

public class Test { 


    public Test() 
    { 

    } 
    public static void main (String args[]) 
    { 
    new Test(); 
    } 

    class Test2 
    { 
     class Test3 
     { 
      class Test4 
      { 
       class Test5{ 
        class Test6{ 
         class Test7{ 
          class Test8{ 
           class Test9 
           { 

           } 
          } 
         } 
        } 
       } 
      } 

     } 

    } 


} 
+4

Si hubiera un límite, entonces eso hubiera sido un defecto de diseño serio en el compilador de Java. – LiraNuna

+0

Solo veo ocho niveles de anidación allí, porque no creo que cuenten la clase externa. Entonces debería agregar Test10 para estar seguro. –

+1

lol ... tiene sentido, pero creo que me gustaría llorar si alguna vez me encontré con algo así "en la naturaleza". :-) – cjstehno

6

Hmmm. Sé que la prueba en línea de Java a la que se refiere es pésima. ¿Eso cuenta?

(Este es el tipo de límite que es irrelevante en la experiencia práctica. Una cuestión de manera similar ridículamente sería, "¿Cuál es la longitud máxima de una función en bytes?")

+7

En realidad, esa última limitación es importante. No tiene importancia * saberlo *, pero puede derivarlo cuando genera código automáticamente. Tuve un convertidor de juegos de aventuras en un punto que sopló ese límite :( –

+1

¿Se nos permite responder "Creo que esto depende del sistema de archivos?" –

+0

@Jon: Touche. :) La única vez que encontré un límite fue cuando código que revisa el código VB6 de un interno. Aparentemente, VB6 solo permitía 32K caracteres por función, por lo que el interno también tenía que agregar las funciones 'DoStuff2' y' DoStuff3'. (No haciendo esos nombres.) –

22

Es una cuestión completamente irrelevante y yo Espero que no estén usando los resultados para nada importante. Creo que la respuesta que estaban buscando era 'cualquier cantidad de veces', pero en la práctica habrá un límite en cualquier implementación dada de Java. Si no se define directamente, estará determinado por algo así como el tamaño máximo de archivo o algún otro límite interno (posiblemente no documentado). La mejor manera de averiguarlo es probarlo.

Actualizar: 30 obras, pero 300 da este error:

A.java:3: error while writing B0.B1.B2.B3.B4.B5.B6.B7.B8.B9.B10.B11.B12.B13.B14. 
B15.B16.B17.B18.B19.B20.B21.B22.B23.B24.B25.B26.B27.B28.B29.B30.B31.B32.B33.B34. 
B35.B36.B37.B38.B39.B40.B41.B42.B43.B44.B45.B46.B47.B48.B49.B50.B51.B52.B53.B54. 
B55.B56.B57.B58.B59.B60.B61.B62.B63.B64.B65.B66.B67.B68.B69.B70.B71.B72.B73.B74. 
B75.B76.B77.B78.B79.B80.B81.B82.B83.B84.B85.B86.B87.B88.B89.B90.B91.B92.B93.B94. 
B95.B96.B97.B98.B99.B100.B101.B102.B103.B104.B105.B106.B107.B108.B109.B110.B111. 
B112.B113.B114.B115.B116.B117.B118.B119.B120.B121.B122.B123.B124.B125.B126.B127. 
B128.B129.B130.B131.B132.B133.B134.B135.B136.B137.B138.B139.B140.B141.B142.B143. 
B144.B145.B146.B147.B148.B149.B150.B151.B152.B153.B154.B155.B156.B157.B158.B159. 
B160.B161.B162.B163.B164.B165.B166.B167.B168.B169.B170.B171.B172.B173.B174.B175. 
B176.B177.B178.B179.B180.B181.B182.B183.B184.B185.B186.B187.B188.B189.B190.B191. 
B192.B193.B194.B195.B196.B197.B198.B199.B200.B201.B202.B203.B204.B205.B206.B207. 
B208.B209.B210.B211.B212.B213.B214.B215.B216.B217.B218.B219.B220.B221.B222.B223. 
B224.B225.B226.B227.B228.B229.B230.B231.B232.B233.B234.B235.B236.B237.B238.B239. 
B240.B241.B242.B243.B244.B245.B246.B247.B248.B249.B250.B251.B252.B253.B254.B255. 
B256.B257.B258.B259.B260.B261.B262.B263.B264.B265.B266.B267.B268.B269.B270.B271. 
B272.B273.B274.B275.B276.B277.B278.B279.B280.B281.B282.B283.B284.B285.B286.B287. 
B288.B289.B290.B291.B292.B293.B294.B295.B296.B297.B298.B299: B0$B1$B2$B3$B4$B5$B 
6$B7$B8$B9$B10$B11$B12$B13$B14$B15$B16$B17$B18$B19$B20$B21$B22$B23$B24$B25$B26$B 
27$B28$B29$B30$B31$B32$B33$B34$B35$B36$B37$B38$B39$B40$B41$B42$B43$B44$B45$B46$B 
47$B48$B49$B50$B51$B52$B53$B54$B55$B56$B57$B58$B59$B60$B61$B62$B63$B64$B65$B66$B 
67$B68$B69$B70$B71$B72$B73$B74$B75$B76$B77$B78$B79$B80$B81$B82$B83$B84$B85$B86$B 
87$B88$B89$B90$B91$B92$B93$B94$B95$B96$B97$B98$B99$B100$B101$B102$B103$B104$B105 
$B106$B107$B108$B109$B110$B111$B112$B113$B114$B115$B116$B117$B118$B119$B120$B121 
$B122$B123$B124$B125$B126$B127$B128$B129$B130$B131$B132$B133$B134$B135$B136$B137 
$B138$B139$B140$B141$B142$B143$B144$B145$B146$B147$B148$B149$B150$B151$B152$B153 
$B154$B155$B156$B157$B158$B159$B160$B161$B162$B163$B164$B165$B166$B167$B168$B169 
$B170$B171$B172$B173$B174$B175$B176$B177$B178$B179$B180$B181$B182$B183$B184$B185 
$B186$B187$B188$B189$B190$B191$B192$B193$B194$B195$B196$B197$B198$B199$B200$B201 
$B202$B203$B204$B205$B206$B207$B208$B209$B210$B211$B212$B213$B214$B215$B216$B217 
$B218$B219$B220$B221$B222$B223$B224$B225$B226$B227$B228$B229$B230$B231$B232$B233 
$B234$B235$B236$B237$B238$B239$B240$B241$B242$B243$B244$B245$B246$B247$B248$B249 
$B250$B251$B252$B253$B254$B255$B256$B257$B258$B259$B260$B261$B262$B263$B264$B265 
$B266$B267$B268$B269$B270$B271$B272$B273$B274$B275$B276$B277$B278$B279$B280$B281 
$B282$B283$B284$B285$B286$B287$B288$B289$B290$B291$B292$B293$B294$B295$B296$B297 
$B298$B299.class (The filename, directory name, or volume label syntax is incorr 
ect) 

código utilizado para generar la fuente (escrito en Python):

n = input() 
print "class A{public static void main(String[] a){}}\n" 
print ''.join("class B%d{" % x for x in range(n)) + '}' * n 

decepcionante. Realmente estaba esperando que fuera mucho más. Me pregunto si podría llegar mucho más lejos en otro sistema que permite nombres de archivo más largos.

+4

Este es un gran trabajo. Yo realmente aprecio tu esfuerzo. –

+3

No sé si lo hizo en Windows, pero una ruta absoluta de archivo en Windows puede tener un máximo de 256 (o 255) caracteres. En Windows definitivamente no puede durar tanto, pero en Unix, podría funcionar mejor. – glmxndr

+0

Sí, esto fue en Windows. Si alguien quiere probarlo en Unix, puede intentar establecer un nuevo registro. Algunas más clases internas adicionales podrían ser eliminadas mediante el uso de nombres de clase más cortos y aprovechando el conjunto de caracteres permitidos para los nombres de las clases. –

4

La verdadera respuesta es ninguna de las anteriores. Javac, por supuesto, permitirá el anidamiento arbitrario, pero el sistema de archivos subyacente y/o el sistema operativo tienen restricciones. Recientemente descubrimos que durante el inicio, la JVM que ejecuta una instancia del servidor de aplicaciones Glassfish Java EE mantendrá abiertos los archivos para cada clase durante la carga/compilación JIT. Si está ejecutando CentOS Linux, por ejemplo, el límite predeterminado para los archivos/procesos abiertos es 1024, por lo que si tiene muchas clases cargadas a la vez y no configura el ulimit -n en un valor más alto, la JVM también presionará " muchos archivos abiertos ". Y el ejemplo de @Mark Byers muestra que los nombres de los archivos .class son muy largos y pueden alcanzar el límite de longitud del nombre del sistema de archivos, si es que hay alguno.

3

Como seguimiento de la versión de prueba de Mark en Windows - un poco tonto pero divertido, sin embargo - hice una prueba en AIX 5.3.

91 subclases de profundidad está bien, número 92 da como resultado el siguiente error:

-rw-r--r-- 1 root  system  12813 Nov 24 15:15 A.class 
Main class=class A 

count=90 class=A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$AA$AB$AC$AD$AE$AF$AG$AH$AI$AJ$AK$AL$AM$AN$AO$AP$AQ$AR$AS$AT$AU$AV$AW$AX$AY$AZ$BA$BB$BC$BD$BE$BF$BG$BH$BI$BJ$BK$BL$BM$BN$BO$BP$BQ$BR$BS$BT$BU$BV$BW$BX$BY$BZ$CA$CB$CC$CD$CE$CF$CG$CH$CI$CJ$CK$CL$CM 

-rw-r--r-- 1 root  system  13081 Nov 24 15:16 A.class 
Main class=class A 

count=91 class=A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$AA$AB$AC$AD$AE$AF$AG$AH$AI$AJ$AK$AL$AM$AN$AO$AP$AQ$AR$AS$AT$AU$AV$AW$AX$AY$AZ$BA$BB$BC$BD$BE$BF$BG$BH$BI$BJ$BK$BL$BM$BN$BO$BP$BQ$BR$BS$BT$BU$BV$BW$BX$BY$BZ$CA$CB$CC$CD$CE$CF$CG$CH$CI$CJ$CK$CL$CM$CN 

A.java:93: error while writing A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.AA.AB.AC.AD.AE.AF.AG.AH.AI.AJ.AK.AL.AM.AN.AO.AP.AQ.AR.AS.AT.AU.AV.AW.AX.AY.AZ.BA.BB.BC.BD.BE.BF.BG.BH.BI.BJ.BK.BL.BM.BN.BO.BP.BQ.BR.BS.BT.BU.BV.BW.BX.BY.BZ.CA.CB.CC.CD.CE.CF.CG.CH.CI.CJ.CK.CL.CM.CN.CO: A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$AA$AB$AC$AD$AE$AF$AG$AH$AI$AJ$AK$AL$AM$AN$AO$AP$AQ$AR$AS$AT$AU$AV$AW$AX$AY$AZ$BA$BB$BC$BD$BE$BF$BG$BH$BI$BJ$BK$BL$BM$BN$BO$BP$BQ$BR$BS$BT$BU$BV$BW$BX$BY$BZ$CA$CB$CC$CD$CE$CF$CG$CH$CI$CJ$CK$CL$CM$CN$CO.class (A file or path name is too long.) 
static class CO { 
    ^
1 error 

La fuente Java generado será similar a:

class A { 
    static class B { 
    void run() { 
     System.out.println("count=" + 2 + " class=" + B.class.getName() + "\n"); 
    } 
    } 

    public static void main(String[] a){ 
    System.out.println("Main class=" + A.class + "\n"); 
    (new A.B()).run(); 
    } 
} 
0

Sí puede anidar una clase infinitamente en Java .

Cuestiones relacionadas