È meglio usare stringhe o int per fare riferimento a enumerazioni esterne alla parte java del sistema?


11

Stavamo discutendo sul mio lavoro sull'uso degli enum in Java.

Un collega stava sostenendo che quando si usano enum sul lato server, ogni volta che è necessario si dovrebbe usare la stringa per fare riferimento ad esso (ad esempio quando si inviano dati da JS al server o quando si archivia nel database), sostenendo che questo è molto più chiaro per lo sviluppatore e sostenendo anche che avrebbe fallito rapidamente in caso di errori di battitura.

Ho sempre usato numeri interi per identificare gli enum in questi casi, perché sarebbero identificatori immutabili e non avrebbero problemi di caso e errore di battitura (anche se uno sviluppatore avesse commesso l'errore di usare il valore 2 invece di 1, non avrebbe fallito rapidamente).

Essendo molto analitico su questi argomenti, direi che usare le stringhe è meglio, ma ho una strana sensazione al riguardo (come se non fosse un buon approccio).

C'è qualche buona pratica riguardo a questa discussione che potrebbe guidarmi?

Modifica: ogni volta che è possibile, usiamo l'enum stesso, quindi tutto il nostro codice Java utilizza l'Enum. Per "riferimento a un enum" intendo: fare riferimento al valore nell'enum quando si scambiano dati da JavaScript al server o si archiviano dati nel database


1
Qual è un "riferimento a un enum" per te? Uso normale nel codice sorgente? Serializzazione per l'archiviazione in una base di dati? Espressione da utilizzare nella documentazione dell'utente? Espressione da utilizzare nella documentazione tecnica? La risposta sarà abbastanza diversa per tutti quelli.
Kilian Foth,

Ho modificato la domanda e spero che sia più chiaro ora: per "riferimento a un enum" intendo fare riferimento al valore quando si scambiano dati da JavaScript al server o viceversa o si memorizza un valore nel database
JSBach

Nell'API javascript utilizzerei sicuramente le stringhe. Nel DB entrambi hanno i loro vantaggi. Alcuni database hanno incorporato il supporto enum.
Codici InCos

Risposte:


15

Buona domanda. L'uso di enum in Java ha principalmente lo scopo di gestire informazioni di natura alquanto categorica. L'esempio classico è usare enum per gestire i quattro tipi di semi che una carta potrebbe avere. Offre tutti i vantaggi in termini di prestazioni dell'utilizzo di un numero intero ed è anche chiaro nel tuo programma.

Quindi, al di fuori di Java, perché non dovresti continuare a utilizzare un numero intero? Forse non hai tipi di enum al di fuori di Java, anche se ciò non significa che non puoi continuare a utilizzare numeri interi a fini prestazionali, giusto? Sì, è del tutto vero, anche se considera cosa succede quando aggiungi un nuovo valore enum. Se non lo aggiungi alla fine, tutti gli altri valori enum dopo il nuovo valore verranno aumentati di uno. Bene, specificheremo semplicemente il numero in modo che non possa cambiare o lo aggiungeremo sempre alla fine. Sei sicuro che i tuoi colleghi colleghi faranno sempre bene? Meh? Probabilmente? Fiduciosamente? Forse non ci sei al 100%. Tienilo a mente per un secondo.

Il tuo capo ti dice che c'è un casino sul client che usa il tuo software dopo l'ultimo aggiornamento. Ora tutte le entità X si comportano come se fossero state assegnate al valore enum Y anche se fossero state realmente assegnate Z. Controlli il repository e sì, qualcuno ha aggiunto un nuovo valore enum e non ha seguito le tue linee guida come hai chiesto loro. Ora hai l'ulteriore complicazione che sul database è scritto 4, quando in realtà dovrebbe essere 3, esclusi i record che sono stati inseriti prima dell'aggiornamento che sono davvero 4. Quale valore enum si riferisce comunque a 4? Non è vero? Non ricordi. Devi verificare il programma per verificare. In poche parole, è un casino.

Se invece il tuo database ha scritto "HEARTS", "DIAMONDS", "SPADES", "CLUBS", hai perso poco in termini di spazio e guadagnato così tanto. È vero che stiamo parlando di un lieve calo delle prestazioni, ma in realtà non dovresti accedere al database che spesso fa la differenza. Per quanto riguarda lo spazio, lascialo agli amministratori di sistema (non il tuo problema.).

Se hai creato un programma semplice a cui è facile apportare modifiche, ti sei fatto un favore a lungo termine, fidati di me. Questo aspetto non è diverso secondo la mia modesta opinione.


2
I punti positivi, ma si sta dimenticando il caso in cui qualcuno decide di cambiare il nome di una delle entità enum ( HEARTSa Hearto qualcosa nel tuo esempio) e improvvisamente tutto si rompe di nuovo.
Scott Whitlock,

1
@ScottWhitlock Non se lo rendi conto, anche se potrebbero decidere di rinominarlo completamente. Potrebbero eliminare accidentalmente il database ed eliminare anche il progetto, ma non possiamo tenere conto di ogni possibile incidente qui.
Neil,

5
@Neil - vero ma stiamo provando a giocare le probabilità qui. Non ho familiarità con gli enum Java, ma in C #, ho impostato esplicitamente i valori per gli enum se i valori devono avere un significato al di fuori del programma (come in un database) (ad esempio Hearts = 1, Diamonds = 2, ecc.) . Poiché questo non è il modo predefinito di usare un enum, dovrebbe dare una pausa dell'editor in seguito. Inoltre è utile un commento che nota dove altri vengono utilizzati.
Scott Whitlock,

1
@ScottWhitlock Questo è sicuramente il modo migliore di procedere al fine di evitare tali problemi. Anche se supponete di averlo fatto, vedete ancora 1, 2, 3, 4 sul database o serializzati in alcuni file. Non ideale dal punto di vista della manutenzione, in qualunque modo lo tagli.
Neil,

2
Se posso aggiungere, se l'enum è serializzato come stringa e qualcuno cambia il nome di un enum, durante la deserializzazione l'errore sarà durante l'analisi. Se l'enum è int e qualcuno modifica la definizione, l'errore sarà più in basso, durante l'elaborazione, che sarà più difficile da diagnosticare. CC @ScottWhitlock.
Endy Tjahjono,

1

Sono d'accordo con la risposta di Neil, ma solo un'aggiunta:

In java enums sono Oggetti, quindi possono avere campi e metodi. Quindi puoi dare a ogni enum un valore specificato manualmente e quando lo fai riferimento per un lavoro esterno, usa invece quel valore.

Sopravviverà sia aggiungendo / rimuovendo / riordinando sia cambiando il nome dell'istanza enum. Ma dovrai scrivere la logica di serializzazione / deserializzazione per i campi enum invece di usare automagic disponibile in molti strumenti. (È facile, ma è un lavoro adizionale).

E devi mantenere quei valori univoci manualmente (ma è lo stesso negli enum di stile C), e puoi scrivere test per verificarlo.


Sì, abbiamo seguito questo percorso, ma stiamo utilizzando l'ibernazione e abbiamo dovuto aggiungere del codice aggiuntivo per poter analizzare il valore da / per il database e sembrava un po 'strano, quindi abbiamo deciso di utilizzare la relazione .STRING e vai con il nome enum.
JSBach,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.