6

Uno stile molto povero da codificare ma a volte inevitabile. È un esempio estremo. QuindiJava: limite per nidificare le classi?

  1. c'è qualche limite per le classi di annidamento?
  2. sono equivalenti?
  3. come gestite tali situazioni? Crea una biblioteca?

Codice

new FileObject().new Format().new Words().new Some().new Continue someThing; 

((((new FileObject()).new Format()).new Words()).new Some()).new Continue someThing; 
+6

è sempre evitabile – Bozho

+1

Questo codice fornito è sintatticamente corretto? – nmr

+0

Non è evitabile in determinate circostanze di generazione del codice. Mi sono imbattuto nel limite di profondità quando usavo Jaxb su un file di schema mal progettato (che, per fortuna, potevo modificare). – Spina

risposta

5

Uno stile molto povero da codificare ma a volte inevitabile.

La seconda parte di questa dichiarazione è palesemente falsa.È sempre possibile evitare l'uso di classi nidificate a livello di implementazione.

Non riesco a pensare a nessun ragionevole motivo motivo per nidificare classi denominate più di un livello e classi anonime più di 3 o 4 livelli. (Mi ricordo una volta utilizzando 3 o 4 livelli di classi interne anonime in un'applicazione Eclipse RCP con callback davvero complicati. Ma questo era davvero insolito, e in retrospettiva è stata una cattiva idea.)

1) è esiste un limite per le classi di nidificazione?

In teoria il limite è il limite di 64 KB sui nomi di classe completi. In pratica, il limite è di buon senso.

2) sono equivalenti?

Essi? Se stai chiedendo se le classi annidate sono equivalenti alle classi non nidificate, la risposta è Sì ... a tutti gli intenti pratici. L'unica cosa che puoi fare con le classi annidate che non puoi fare con le classi regolari è condividere cose dichiarate come private. E la soluzione è di rilassare il tuo accesso al pacchetto privato.

3) come affrontare tali situazioni? Crea una biblioteca?

Non so di quale situazione si stia parlando. Il modo normale di modularizzare un programma Java composto da più classi consiste nell'usare pacchetti Java piuttosto che nidificazione di classi. E 'quello che ti stai perdendo?

3

L'esempio si dà sono classi annidate non statici. (È necessario un oggetto del tipo della classe di inclusione per creare un'istanza della classe nidificata.) Le classi non statiche nidificate vengono utilizzate raramente. Di solito si può fare altrettanto bene con classi nidificate statiche o classi non nidificate con ambito (pacchetto) predefinito.

4

A livello di bytecode, non esiste una classe nidificata - il compilatore le trasforma in classi separate di livello superiore che possono accedere ai metodi della classe genitore tramite metodi di accesso sintetici.

Non esiste un limite esplicito per la profondità di annidamento. Il limite implicito più rilevante è il nome del file .class generato, che replica la gerarchia di contenimento, ad esempio FileObject$Format$Words$Some$Continue.class. Questo finirà per raggiungere i limiti di lunghezza del nome del file, a seconda del filesystem.

+0

Buona risposta, ma penso che i metodi di accesso vengano creati solo quando i metodi nella classe nidificata non sono pacchetti-privati. – helpermethod

+0

@helpermethod: non è corretto. L'accesso non fa differenza. Forse stai pensando a 'statico'. –

2

Come stato in Inner Classes and Enclosing Instances (in spec langage), la classe nidificata è una sorta di classe interna statica.

Quindi suppongo che nel tuo caso sia interno, non annidato.

Nel caso interno faccio qualche metodo di istanza di fabbrica nel racchiudere la classe, perché non amo l'espressione new Toto(). New Foo() ... ottieni un oggetto foo, ma dov'è l'oggetto toto?

Per nidificato, faccio un nuovo Toto.Foo.Bar.Other.And.So.On().

5

Il Sun JVM ha un limite di 65536 byte per un nome di classe completo codificato come una stringa utilizzando modificato UTF-8 come descritto in "La classe File Format " spec. Viene dalla capacità 'u2' (16 bit) - il tipo di 'lunghezza' dalla struttura costante 'CONSTANT_Utf8_info' utilizzato per memorizzare i nomi di classe nei file della classe .

Da maximum length for a java class name

Inoltre, il formato jar (basato su zip) presenta una lunghezza massima nome anche di 64k. (Wikipedia, ZIP, File headers.)

Quindi, il limite per l'annidamento di classe è quando il nome raggiunge 64k, ma penso che il tuo equilibrio mentale possa raggiungere il suo limite molto prima!

+0

Intendo dire lunghezza del nomefile, questo è essenzialmente la questione, quanto può essere un nome di classe. I limiti del formato zip contenevano nomi di file a 64k (non contenuti di file). – mdma

Problemi correlati