2013-08-25 1 views
4

Этот вопрос был задан после прочтения «Эффективной Java» Джошуа Блоха. В частности, в пункте № 10 он утверждает, что неправильная практика заключается в анализе строкового представления объекта и использовании его для чего-либо, кроме дружественной распечатки/отладки. Причина в том, что такое использование «подвержено ошибкам, приводит к хрупким системам, которые ломаются, если вы меняете формат». Для меня это похоже на то, что Guava's Ordering.usingToString() - это пятно на примере этого. Так это плохая практика, чтобы использовать его?Следует ли избегать Guavas Ordering.usingToString()?

ответ

8

Ну, если сортировка используется только для определения того, в каком порядке отображать вещи для пользователя, я бы сказал, что это часть «более дружественной распечатки/отладки».

Если, однако, правильность ваших кодов зависит от заказа, тогда я бы сказал, что это действительно плохая идея, зависит от toString.

1

Если программы когда-либо использовала toString() для лексической сортировки используя естественный порядок таким образом, что выполнение программы зависит от него, то было бы целесообразно, чтобы переопределить значение по умолчанию toString() класса, который продлен. Вы должны в этом случае сделать toString() метод окончательный и ясно документ, который он используется для заказа.

Однако было бы намного лучше создать другой метод, возвращающий String, и создать заказ в зависимости от этого результата, возможно, создав конкретный Comparator для сортировки. См. Например, последний метод name(), используемый для перечислений на Java. В общем случае он создает ту же строку, что и toString(), но по-прежнему можно выполнить упорядочение с ней, даже если toString() был переопределен.

Если вы используете последний метод, то Ordering.usingToString() не будет полезен, конечно.

+0

Это в дополнение * к ответу Йоахима, конечно. –

0

Есть некоторые очевидные случаи, когда это на самом деле имеет смысл, например, StringBuffer и т. Д. Очевидно, что для большинства классов «бизнес» не имеет смысла полагаться на toString().

3

Как автор этого метода, я бы согласился: это действительно просто костыль. Для этих «взглядов, мне просто нужны Ordering<Object>, черт возьми». Вероятно, он должен быть удален, так как вы можете получить его поведение с Ordering.onResultOf(Functions.toStringFunction) в любом случае.

 Смежные вопросы

  • Нет связанных вопросов^_^