Stiamo implementando un adattatore per Jaxen (una libreria XPath per Java) che ci consente di utilizzare XPath per accedere al modello di dati della nostra applicazione.
Questo viene fatto implementando classi che mappano le stringhe (passate da Jaxen) in elementi del nostro modello di dati. Stimiamo che avremo bisogno di circa 100 classi con oltre 1000 confronti di stringhe in totale.
Penso che il modo migliore per farlo sia semplice se / else istruzioni con le stringhe scritte direttamente nel codice - piuttosto che definire ogni stringa come costante. Per esempio:
public Object getNode(String name) {
if ("name".equals(name)) {
return contact.getFullName();
} else if ("title".equals(name)) {
return contact.getTitle();
} else if ("first_name".equals(name)) {
return contact.getFirstName();
} else if ("last_name".equals(name)) {
return contact.getLastName();
...
Tuttavia mi è stato sempre insegnato che non dovremmo incorporare i valori di stringa direttamente nel codice, ma creare invece costanti di stringa. Sarebbe simile a questo:
private static final String NAME = "name";
private static final String TITLE = "title";
private static final String FIRST_NAME = "first_name";
private static final String LAST_NAME = "last_name";
public Object getNode(String name) {
if (NAME.equals(name)) {
return contact.getFullName();
} else if (TITLE.equals(name)) {
return contact.getTitle();
} else if (FIRST_NAME.equals(name)) {
return contact.getFirstName();
} else if (LAST_NAME.equals(name)) {
return contact.getLastName();
...
In questo caso penso che sia una cattiva idea. La costante verrà utilizzata una sola volta, nel filegetNode()
metodo. L'uso diretto delle stringhe è altrettanto facile da leggere e comprendere come l'utilizzo delle costanti e ci consente di risparmiare scrivendo almeno mille righe di codice.
Quindi c'è qualche motivo per definire le costanti di stringa per un singolo uso? O è accettabile usare direttamente le stringhe?
PS. Prima che qualcuno suggerisse di usare enum invece, lo abbiamo prototipato ma la conversione di enum è 15 volte più lenta del semplice confronto di stringhe, quindi non viene presa in considerazione.
Conclusione: le risposte che seguono hanno ampliato l'ambito di questa domanda oltre le sole costanti di stringa, quindi ho due conclusioni:
- Probabilmente è OK usare le stringhe direttamente anziché le costanti di stringa in questo scenario, ma
- Ci sono modi per evitare di usare le stringhe, il che potrebbe essere migliore.
Quindi proverò la tecnica wrapper che evita completamente le stringhe. Sfortunatamente non possiamo usare l'istruzione switch di stringa perché non siamo ancora su Java 7. Alla fine, però, penso che la migliore risposta per noi sia provare ogni tecnica e valutarne le prestazioni. La realtà è che se una tecnica è chiaramente più veloce, probabilmente la sceglieremo indipendentemente dalla sua bellezza o aderenza alla convenzione.
switch
etichette. Utilizzare un interruttore anziché le if
cascate.