Wir implementieren einen Adapter für Jaxen (eine XPath-Bibliothek für Java), mit dem wir über XPath auf das Datenmodell unserer Anwendung zugreifen können.
Dies geschieht durch die Implementierung von Klassen, die Zeichenfolgen (die uns von Jaxen übergeben wurden) in Elemente unseres Datenmodells abbilden. Wir schätzen, dass wir ungefähr 100 Klassen mit insgesamt über 1000 Zeichenfolgenvergleichen benötigen.
Ich denke, dass der beste Weg, dies zu tun, einfach ist, wenn / else-Anweisungen mit den Zeichenfolgen direkt in den Code geschrieben - anstatt jede Zeichenfolge als Konstante zu definieren. Beispielsweise:
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();
...
Es wurde mir jedoch immer beigebracht, dass wir keine Zeichenfolgenwerte direkt in Code einbetten sollten, sondern stattdessen Zeichenfolgenkonstanten erstellen sollten. Das würde ungefähr so aussehen:
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 diesem Fall halte ich es für eine schlechte Idee. Die Konstante wird in der getNode()
Methode immer nur einmal verwendet. Die direkte Verwendung der Zeichenfolgen ist genauso einfach zu lesen und zu verstehen wie die Verwendung von Konstanten und erspart uns das Schreiben von mindestens tausend Codezeilen.
Gibt es also einen Grund, String-Konstanten für eine einmalige Verwendung zu definieren? Oder ist es akzeptabel, Zeichenfolgen direkt zu verwenden?
PS. Bevor jemand vorschlägt, stattdessen Aufzählungen zu verwenden, haben wir dies als Prototyp erstellt, aber die Aufzählungskonvertierung ist 15-mal langsamer als ein einfacher Zeichenfolgenvergleich, sodass dies nicht berücksichtigt wird.
Schlussfolgerung: Die folgenden Antworten haben den Umfang dieser Frage über reine String-Konstanten hinaus erweitert, sodass ich zwei Schlussfolgerungen ziehen kann:
- In diesem Szenario ist es wahrscheinlich in Ordnung, die Zeichenfolgen direkt anstelle von Zeichenfolgenkonstanten zu verwenden
- Es gibt Möglichkeiten, die Verwendung von Zeichenfolgen zu vermeiden, was möglicherweise besser ist.
Also werde ich die Wrapper-Technik ausprobieren, die Strings komplett vermeidet. Leider können wir die Anweisung string switch nicht verwenden, da wir noch nicht mit Java 7 arbeiten. Letztendlich denke ich jedoch, dass die beste Antwort für uns darin besteht, jede Technik auszuprobieren und ihre Leistung zu bewerten. Die Realität ist, dass wenn eine Technik deutlich schneller ist, wir sie wahrscheinlich unabhängig von ihrer Schönheit oder Konvention wählen werden.
switch
Labels. Verwenden Sie einen Schalter anstelle von if
Kaskaden.