Мы реализуем адаптер для Jaxen (библиотека XPath для Java), который позволяет нам использовать XPath для доступа к модели данных нашего приложения.
Это делается путем реализации классов, которые отображают строки (переданные нам из Jaxen) в элементы нашей модели данных. По нашим оценкам, нам потребуется около 100 классов с более чем 1000 сравнений строк.
Я думаю, что лучший способ сделать это - простые операторы if / 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. Прежде чем кто-либо предложит использовать перечисления вместо этого, мы прототипировали это, но преобразование перечисления в 15 раз медленнее, чем простое сравнение строк, поэтому оно не рассматривается.
Вывод: ответы ниже расширили сферу этого вопроса за пределы строковых констант, поэтому у меня есть два вывода:
- Возможно, в этом сценарии можно использовать строки напрямую, а не строковые константы, но
- Есть способы вообще избежать использования строк, которые могут быть лучше.
Итак, я собираюсь попробовать технику обертки, которая полностью избегает строк. К сожалению, мы не можем использовать оператор переключения строк, потому что мы еще не на Java 7. В конечном счете, я думаю, что лучший ответ для нас - попробовать каждую технику и оценить ее эффективность. Реальность такова, что если один метод явно быстрее, то мы, вероятно, выберем его независимо от его красоты или приверженности условностям.
switch
меток. Используйте переключатель вместо if
каскадов.