Wdrażamy adapter dla Jaxen (biblioteka XPath dla Java), który pozwala nam używać XPath do uzyskiwania dostępu do modelu danych naszej aplikacji.
Odbywa się to poprzez implementację klas, które mapują ciągi znaków (przekazane nam z Jaxen) na elementy naszego modelu danych. Szacujemy, że potrzebujemy około 100 klas z łącznie ponad 1000 ciągów porównań.
Myślę, że najlepszym sposobem na zrobienie tego jest prosta instrukcja if / else z ciągami zapisanymi bezpośrednio w kodzie - zamiast definiowania każdego z nich jako stałej. Na przykład:
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();
...
Jednak zawsze uczono mnie, że nie powinniśmy osadzać wartości ciągów bezpośrednio w kodzie, ale zamiast tego tworzyć stałe ciągów. To by wyglądało mniej więcej tak:
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();
...
W tym przypadku myślę, że to zły pomysł. Stała będzie kiedykolwiek używana w getNode()
metodzie tylko raz . Bezpośrednie korzystanie z ciągów jest tak samo łatwe do odczytania i zrozumienia, jak używanie stałych, i oszczędza nam pisania co najmniej tysiąca wierszy kodu.
Czy jest więc jakiś powód, aby definiować stałe ciągów dla pojedynczego użycia? Czy też dopuszczalne jest używanie ciągów bezpośrednio?
PS. Zanim ktokolwiek zasugeruje użycie zamiast tego wyliczeń, prototypowaliśmy to, ale konwersja wyliczenia jest 15 razy wolniejsza niż zwykłe porównywanie ciągów, więc nie jest brana pod uwagę.
Wniosek: poniższe odpowiedzi rozszerzyły zakres tego pytania poza zwykłe ciągi znaków, więc mam dwa wnioski:
- Prawdopodobnie w tym scenariuszu można używać bezpośrednio łańcuchów zamiast stałych ciągów, ale
- Istnieją sposoby na uniknięcie używania ciągów, co może być lepsze.
Więc wypróbuję technikę owijania, która całkowicie unika ciągów. Niestety nie możemy użyć instrukcji switch string, ponieważ nie korzystamy jeszcze z Java 7. Ostatecznie jednak uważam, że najlepszą odpowiedzią dla nas jest wypróbowanie każdej techniki i ocena jej wydajności. Rzeczywistość jest taka, że jeśli jedna technika jest wyraźnie szybsza, prawdopodobnie wybierzemy ją bez względu na jej piękno lub przestrzeganie konwencji.
switch
etykiety. Użyj przełącznika zamiast if
kaskad.