2009-11-23 24 views
9

Ich bin über diese Fragen auf einem der Online-Java-Tests gestoßen. Die Optionen waren 4,5,8 und beliebig oft.Wie oft können Klassen innerhalb einer Klasse verschachtelt werden?

Ich habe nur eine innere Klasse verwendet, aber noch nie mehrere getestet. Ich habe mich gefragt, ob jemand die Antwort kennt.

+0

@Kevin Bourrillion - Ich habe versucht zu verstehen, ob es ein definiertes Limit gab. Ich habe 9 innere Klassen probiert. –

+0

Ich frage mich, wer hat das Online-Java-Test geschrieben? Ist es wirklich eine Sache, auf die sich der Entwickler beim Java-Studium einstellen sollte? – incarnate

Antwort

4

Ich versuchte es selbst: Die Antwort ist beliebig oft. Das Folgende ist meine Testklasse, ich hatte keine Kompilierungsfehler.

 

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

Wenn es ein Limit gäbe, wäre das ein schwerwiegender Konstruktionsfehler im Java-Compiler gewesen. – LiraNuna

+0

Ich sehe nur acht Ebenen der Verschachtelung dort, weil ich nicht denke, dass sie die äußere Klasse zählen würden. Also sollten Sie Test10 hinzufügen, um sicher zu sein. –

+1

lol ... macht Sinn, aber ich denke, ich würde weinen, wenn ich jemals über so etwas "in freier Wildbahn" gerannt wäre. :-) – cjstehno

6

Hmmm. Ich weiß, dass der Online-Java-Test, auf den Sie sich beziehen, ein lausiger ist. Zählt das?

(Dies ist die Art von Grenze, die in der Praxis. Eine ähnlich lächerlich Frage wäre irrelevant ist: „Was ist die maximale Länge einer Funktion in Bytes ist?“)

+7

Eigentlich ist diese letzte Einschränkung wichtig. Es ist völlig unwichtig, es * zu wissen, aber es kann dich durchbohren, wenn du automatisch Code erzeugst. Ich hatte ein Adventure-Spiel-Konverter an einem Punkt, der diese Grenze blies :( –

+1

Sind wir erlaubt zu beantworten "Ich denke, das hängt von dem Dateisystem ab?" –

+0

@Jon: Touche. :) Nur einmal lief ich in eine Grenze wie das war wann Code, der den VB6-Code eines Praktikanten überprüft. Anscheinend erlaubte VB6 nur 32K Zeichen pro Funktion, also musste der Praktikant auch die 'DoStuff2' und' DoStuff3' Funktionen hinzufügen. (Nicht diese Namen zu machen.) –

22

Es ist eine völlig irrelevant Frage und ich Ich hoffe, sie haben die Ergebnisse nicht für etwas Wichtiges verwendet. Ich denke, die Antwort, nach der sie suchten, war "beliebig oft", aber in der Praxis wird es bei jeder Implementierung von Java ein Limit geben. Wenn es nicht direkt definiert wird, wird es durch etwas wie die maximale Dateigröße oder ein anderes (möglicherweise undokumentiertes) internes Limit bestimmt. Der beste Weg, um herauszufinden, ist es zu versuchen.

Update: 30 Werke, aber 300 gibt diesen Fehler:

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) 

-Code verwendet Quelle zu erzeugen (geschrieben in 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 

Enttäuschend. Ich hatte eigentlich gehofft, es wäre noch viel mehr. Ich frage mich, ob es auf einem anderen System, das längere Dateinamen erlaubt, viel weiter kommen könnte.

+4

Das ist tolle Arbeit. Ich schätze deine Bemühungen sehr. –

+3

Ich weiß nicht, ob Sie das unter Windows getan haben, aber ein absoluter Dateipfad in Windows kann maximal 256 (oder 255?) Zeichen haben. Unter Windows kann es definitiv nicht so lange gehen, aber unter Unix funktioniert es vielleicht besser. – glmxndr

+0

Ja, das war unter Windows. Wenn jemand es unter Unix ausprobieren möchte, können sie gerne versuchen, einen neuen Rekord zu setzen. Ein paar zusätzliche innere Klassen könnten herausgequetscht werden, indem kürzere Klassennamen verwendet werden und der volle erlaubte Zeichensatz für Klassennamen genutzt wird. –

4

Die wahre Antwort ist keines der oben genannten. Javac wird natürlich beliebige Verschachtelung erlauben, aber das zugrundeliegende Dateisystem und/oder OS haben Beschränkungen. Wir haben kürzlich festgestellt, dass die JVM, die eine Glassfish Java EE-Anwendungsserverinstanz ausführt, beim Laden/JIT-Kompilieren während des Startvorgangs geöffnete Dateien für jede .class-Datei bereithält. Wenn Sie CentOS Linux verwenden, ist das Standardlimit für geöffnete Dateien/Prozesse 1024. Wenn also viele Klassen gleichzeitig geladen werden und die ulimit -n nicht auf einen höheren Wert gesetzt wird, trifft die JVM auch "too" viele offene Dateien ". Und das @Mark Byers-Beispiel zeigt, dass die .class-Dateinamen sehr lang werden und die Länge des Namenslimits des Dateisystems erreichen können, falls es einen gibt.

3

Als Follow-up zu Marks Windows-Test - ein bisschen albern, aber trotzdem Spaß - habe ich eine Testversion von AIX 5.3.

91 Subklassen tief ist in Ordnung, Nummer 92 Ergebnisse in dem folgenden Fehler:

-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 

Der generierte Java-Quellcode wie folgt aussieht:

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

Ja, Sie können Nest eine Klasse unendlich in Java .

Verwandte Themen