Implementiamo 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 le classi che mappano le stringhe (passate a noi 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 le istruzioni / else con le stringhe scritte direttamente nel codice - piuttosto che definire ogni stringa come una costante. Ad 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 è sempre stato insegnato che non dovremmo incorporare i valori stringa direttamente nel codice, ma piuttosto creare 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à sempre utilizzata una sola volta, nel metodo getNode()
. Usare direttamente le stringhe è altrettanto facile da leggere e capire come usare le costanti e ci consente di scrivere almeno un migliaio di righe di codice.
Quindi c'è qualche ragione per definire le costanti di stringa per un singolo uso? O è accettabile utilizzare direttamente le stringhe?
PS. Prima che qualcuno suggerisca di utilizzare l'enumerazione, invece, l'abbiamo prototipato, ma la conversione enum è 15 volte più lenta del semplice confronto tra stringhe, quindi non viene presa in considerazione.
Conclusione: Le risposte seguenti hanno ampliato lo scopo di questa domanda oltre le sole costanti di stringa, quindi ho due conclusioni:
- Probabilmente è OK utilizzare le stringhe direttamente anziché le costanti stringa in questo scenario, ma
- Ci sono modi per evitare di utilizzare le stringhe, il che potrebbe essere migliore.
Quindi vado a provare la tecnica wrapper che evita completamente le stringhe. Sfortunatamente non possiamo usare l'istruzione switch delle stringhe perché non siamo ancora su Java 7. In definitiva, penso che la migliore risposta per noi sia provare ogni tecnica e valutare le sue prestazioni. La realtà è che se una tecnica è chiaramente più veloce, probabilmente la sceglieremo indipendentemente dalla sua bellezza o aderenza alla convenzione.