2010-11-10 7 views
13

Recentemente mi sono imbattuto in uno standard di codifica in cui si afferma che è necessario mai utilizzare public enumerazione interna/classi in Java. Questa è la prima volta che ho incontrato questa convenzione e non sono stato in grado di trovare una spiegazione soddisfacente del perché.Non utilizzare mai le enumerazioni nidificate pubbliche?

Capisco perché le classi interne pubbliche dovrebbero essere evitate, ma per quali ragioni non utilizzeresti mai enumerazioni pubbliche annidate? Oppure, perché questa è una cattiva convenzione da seguire?

+0

dove hai letto a riguardo? puoi indicare quell'articolo –

+2

Quando dici di "imbattersi" in questo stadard. Come e dove Sicuramente dovunque affermasse avrebbe dato qualche ragionamento. – David

+0

Sfortunatamente, non riesco a collegarmi all'origine come era nella forma di una e-mail aziendale interna. Il ragionamento è stato breve e citato rendendo più facile il debugging e seguendo le convenzioni java. – AEW

risposta

12

Disclaimer:Le seguenti regole non sono rigide e veloci. Queste sono solo le mie opinioni e preferenze personali. Personalmente trovo che rende il mio codice più facile da leggere e più facile da mantenere.

Prima una domanda. Dove hai trovato questo consiglio? Hanno fornito qualche razionale?

Nella mia esperienza, ho utilizzato normalmente enumerazioni nidificate private per migliorare la leggibilità e la gestibilità del mio codice. Questo in particolare entra in gioco quando si esegue un'integrazione con un altro sistema e si devono inviare stringhe o numeri specifici. Trovo che l'uso di enum faciliti la lettura e la manutenzione. In questo caso specifico, l'informazione trasmessa dall'enumerazione è limitata alla classe (cioè, non ha senso al di fuori della classe e nessun altro dovrebbe averne bisogno).

Non riesco a pensare a una ragione definitiva che spieghi perché le enumerazioni interne pubbliche sono una cattiva pratica. Ma qui ci sono motivi per cui non (normalmente) li usano:

  • Se l'enum è pubblica, significa essenzialmente che trasmette informazioni in un ambito più ampio (ad esempio, ha senso al di fuori della portata della sua classe padre e quindi probabilmente significa che altre cose lo stanno usando). Se questo è il caso, allora potrebbe essere più sensato renderlo un enum autonomo.
  • Lo trovo ThirdPartyResponseCodes.Success più facile per gli occhi anziché ThirdPartyIntegrationInterface.ThirdPartyResponseCodes.Success. Non vi è alcun motivo per cui non si possa nominare l'enumerazione in modo appropriato per fornire un contesto e quindi renderlo un enume autonomo.
  • Immagino che le stesse ragioni per non usare le classi interne pubbliche si applichino anche alle enumerazioni interne pubbliche. Prima di tutto, se hai una classe interiore, potrebbe significare che la tua classe esterna potrebbe beneficiare del refactoring. Forse la tua classe esterna sta cercando di fare troppo?Il rovescio della medaglia però, vi è il vantaggio dell'incapsulamento e dell'ambito limitante, specialmente se si può sostenere che la classe interiore ha senso solo nel contesto della classe esterna (che dovrebbe andare senza dire se è privata). Se è una classe interna pubblica, allora questo probabilmente significa che il suo ambito si estende oltre la classe esterna e quindi dovrebbe essere estratto.
  • Se davvero hai bisogno di usare un enum nidificato pubblico dovresti documentare esattamente perché ne avresti bisogno (non ho ancora trovato una ragione per farlo) e perché è meglio lasciarlo come enum annidato pubblico e non un enume pubblico indipendente.
+0

Sono un collaboratore di AEW. Per quanto riguarda il punto 3, la classe in questione era una classe di lunghezza unitaria basata sul modello di java TimeUnit, tuttavia anche il valore era internamente (nell'unità nativa). Ho ritenuto che fosse un caso piuttosto chiaro di incapsulamento e limitazione dell'ambito. – swarfrat

0

La ragione è presumibilmente che rende queste enumerazioni difficili da utilizzare al di fuori della classe in cui sono dichiarate, dal momento che è necessario qualificarle con il nome della classe che le include. Lo stesso vale per qualsiasi classe interiore pubblica, ovviamente. E non sono sicuro che sarei d'accordo - certamente non come una regola dura e veloce.

0

Dovrete chiedere alla persona che ha scritto lo standard di codifica, se non contiene una spiegazione. Tuttavia, questa affermazione del tuo è un po 'confusa:

capisco perché le classi interne pubbliche dovrebbero essere evitati, ma per quello che ragioni avrei mai usare pubblici enumerazioni annidati?

Perché pensi che le classi interne pubbliche dovrebbero essere evitate? E perché questa motivazione non si applica alle enumerazioni?

+0

Vedere http://onjava.com/pub/a/onjava/excerpt/HardcoreJava_chap06/index.html. Le classi interne hanno costruttori dispari quando vengono usate al di fuori della classe contenente. Questo è diverso dalle classi interne nidificate (cioè statiche), che è il modo in cui si comportano le enumerazioni nidificate. – AEW

+0

Questo è più un commento che una risposta. –