La combinazione di enum con stringhe statiche in java potrebbe essere trascurata?

3

Attualmente la mia squadra ha un numero di costanti definito come stringhe finali statiche. Voglio essere in grado di scorrere su queste stringhe come se fossero enum in una posizione, ma in qualsiasi altro modo vengono utilizzate come stringhe costanti. Gli altri sviluppatori non li vogliono come Enum perché non vogliono aggiungere un valore all'enumerazione ogni volta che vogliono usare le costanti, sentendo che è troppo prolisso e quindi ingombrante.

Sembra che il modo più semplice per mantenere il modo in cui gli altri hanno fatto le cose pur ottenendo la convenienza dell'iterazione (senza entrare in una riflessione) è di fare entrambe le cose. Avere un enum, ma in aggiunta definire un campo finale statico che è uguale al valore dell'enum per ogni enum, in modo che altri possano scegliere di usare la stringa statica il più delle volte, ma avere l'enum per ricominciare quando vogliono un vero "Enum".

Tuttavia, in qualche modo questo mi sembra sbagliato, anche se soddisfa i due bisogni desiderati. C'è un modo migliore per rendere queste stringhe iterabili?

    
posta dsollen 24.08.2015 - 18:47
fonte

3 risposte

3

I want to be able to iterate over these strings as if they were an enum in one location, but everywhere else they are used just as constant strings.

Quindi definisci un elenco (o vettore o array), carica gli elementi necessari e itera su quello.
Se veramente ne hai solo bisogno in una posizione, definiscilo e caricalo lì. Se esiste la possibilità che tu voglia utilizzarlo di nuovo di nuovo , definirlo accanto ai valori di stringa statici.

    
risposta data 25.08.2015 - 12:57
fonte
1

Sì.

Se è necessario o meno utilizzare le enumerazioni è una storia diversa, ma:

Se utilizzi sia le enumerazioni che le costanti String, avrai bisogno di un modo per mantenere questi valori sincronizzati nel tuo codice. Le enumerazioni su cui stai iterando devono corrispondere alle costanti utilizzate dai tuoi colleghi. Mantenere questo codice sarà difficile. Qualcuno ad un certo punto arriverà e cambierà un enum e quindi non aggiornerà i tuoi valori di stringa costante di conseguenza - o viceversa.

Questo è un buon posto in cui puoi sfruttare i metodi negli oggetti Enum, l'ho usato molte volte in passato. Fornendo esplicitamente la costante nell'enumerazione stessa e utilizzando un metodo per restituire la costante dall'enumerazione, vincerai il valore dell'enumerazione e la sua rappresentazione String nello stesso punto, rendendo la manutenzione del codice molto più semplice.

Penso che la duplicazione di questi valori nel tuo codice finirà inevitabilmente in rappresentazioni divergenti di ciò che desideri veramente.

    
risposta data 24.08.2015 - 23:07
fonte
0

The other developers do not want them as Enums because they don't want to have to add a .value to the enum every time they want to use the constants, feeling it's too verbose and thus cumbersome.

Questo è facile. Le obiezioni degli altri sviluppatori non sono semplicemente differenze di opinione; sono in realtà sbagliati. È possibile importare staticamente le costanti enum per evitare di digitare costantemente il nome della classe enum. Direi che questo riduce la chiarezza, ma questo è una questione di opinione. Ad esempio, se hai un enum chiamato MetasyntacticVariable , potresti scrivere:

import static MetasyntacticVariable.*;

class Derp {
   void someMethod(MetasyntacticVariable var) {
      if(var == FOO) { ... }
   }
}

Cambia l'enum in una classe non istantanea che contiene costanti di stringa e la dimensione del codice è pressoché la stessa, ma rinuncia alla sicurezza del tipo:

import static MetasyntacticVariables.*;

class Derp {
   void someMethod(String var) {
      if(FOO.equals(var)) { ... }
   }
}

Spero tu non stia utilizzando l'antipattern dell'interfaccia costante per evitare di importare le costanti.

    
risposta data 28.08.2015 - 05:32
fonte

Leggi altre domande sui tag