Обратите внимание, что вы, вероятно, смущены тем, что показано в toString
и как равенство (equals
) ведет себя.
То, что вы видите, является результатом toString()
. Любой тип может решить, как может выглядеть его строковое представление, переопределив этот метод. Это, однако, не влияет на то, как объекты этого типа сравниваются друг с другом. Вот где появляется equals
(в некоторых случаях также compare
).
Другие писали что-то о том, что базовый тип сравниваемых объектов не равен (одна сторона StringBuilder
и другая String
). Однако актуальной проблемой является equals
-метод. Возможно (обычно это не делается по разным причинам), что equals
для определенного типа поддерживает равенство различных типов объектов (такое поведение (должно быть) должно быть упомянуто в интерфейсе по крайней мере). Если ничего не указано, можно предположить, что выполняется равенство по умолчанию из Object.equals
.
В этом случае, однако, CharSequence
-javadoc уже заявляет следующее о равенстве (выделено мое):
Этот интерфейс не уточняет общие контракты [ 1111] и
blockquote>hashCode
методы. Результат проверки двух объектов, которые реализуют CharSequence на равенство, поэтому, как правило, не определен . Каждый объект может быть реализован отдельным классом, и нет никакой гарантии, что каждый класс сможет проверить свои экземпляры на равенство с другими. Поэтому нецелесообразно использовать произвольные экземпляры CharSequence в качестве элементов в наборе или в качестве ключей на карте.Подводя итог: забудьте, что вы получили
String
илиStringBuilder
изsubSequence
иreversed
. Контракт метода указываетCharSequence
, и поэтому вы должны обрабатывать его какCharSequence
. Нет гарантии, что эти функции все равно будут возвращатьString
илиStringBuilder
в будущем.
Позвольте мне спросить Вас это:
Что происходит, если два года с этого времени Вы решаете добавить 'музыкальное сообщение' как тип блога? Необходимо ли составить новую таблицу для MusicPost и затем повторно кодировать ли приложение для интеграции его? Или Вы вошли бы в систему своей панели администрации блога, добавьте тип блога в выпадающем поле под названием 'Музыка', и быть на Вашем веселом пути?
В этом случае, меньше таблиц!
Проблема подобна вопросу того, как глубоко Ваша иерархия должна быть в дизайне OO.
Простой подход в терминах OO должен был бы иметь базовый класс Post
и дети для BlogPost
, ForumPost
и так далее. Comment
мог или быть ребенок Post
или его собственная иерархия, в зависимости от Ваших требований.
Затем то, как это будет отображенным на Таблицах базы данных, является совершенно другим вопросом. Это классическое эссе Scott Ambler имеет дело с различными стратегиями отображения и объясняет их преимущества и недостатки довольно подробным способом.
Обычно жизнь будет легче, если у Вас могут быть все сообщения в одной таблице:
Однако Вы могли столкнуться с некоторыми проблемами:
Если Вы работаете к такой проблеме, можно составить новую таблицу только для определенных атрибутов того подтипа сообщения - например:
create table posts (post_id number primary key,
post_date date,
post_title ...); /* All the common attributes */
create table photo_post (post_id references posts, photograph ...);
Во многих случаях никакие такие проблемы не возникают, и единственная таблица для всех будет достаточна.
Я не могу думать ни о какой заслуге в составлении отличной таблицы для каждого подтипа.