Ми реалізуємо адаптер для Jaxen (бібліотека XPath для Java), що дозволяє нам використовувати XPath для доступу до моделі даних нашого додатку.
Це робиться шляхом впровадження класів, які відображають рядки (передані нам від Jaxen) в елементи нашої моделі даних. Ми вважаємо, що нам знадобиться близько 100 класів із понад 1000 порівняннями струн.
Я думаю, що найкращий спосіб зробити це простий, якщо / else висловлювання з рядками, записаними безпосередньо в код, - а не визначення кожного рядка як константи. Наприклад:
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();
...
Однак мене завжди вчили, що ми не повинні вбудовувати рядкові значення безпосередньо в код, а створювати замість них рядкові константи. Це виглядатиме приблизно так:
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();
...
У цьому випадку я думаю, що це погана ідея. Константа буде використана лише один раз у getNode()
методі. Використання рядків прямо так само легко читати і розуміти, як використовувати константи, і економить нас, як записати принаймні тисячу рядків коду.
То чи є причина для визначення рядкових констант для одного використання? Або прийнятно використовувати рядки безпосередньо?
PS. Перш ніж хтось запропонує використовувати замість цього enums, ми прототипували це, але перетворення enum у 15 разів повільніше, ніж просте порівняння рядків, тому воно не розглядається.
Висновок: Відповіді, наведені нижче, розширили обсяг цього питання за межі просто рядкових констант, тому у мене є два висновки:
- Можливо, добре використовувати рядки в цьому сценарії, а не рядкові константи, але
- Є способи взагалі уникнути використання рядків, що може бути краще.
Тому я спробую обернути техніку, яка повністю уникає струн. На жаль, ми не можемо використовувати оператор перемикання рядків, оскільки ми ще не на Java 7. Зрештою, я думаю, найкраща відповідь для нас - спробувати кожну техніку та оцінити її ефективність. Реальність полягає в тому, що якщо одна техніка явно швидша, ми, ймовірно, виберемо її незалежно від її краси чи дотримання умовності.
switch
міток. Використовуйте вимикач замість if
каскадів.