Вы можете написать общие шаблоны с несколькими границами. Поэтому измените ваше объявление <K, V extends Observable>
на <K, V extends Observable & Comparable<V>>
, и тогда вы сможете рассматривать V так, как будто он реализует оба интерфейса, без в противном случае пустого и бесполезного интерфейса.
Еще несколько вещей: выберите соглашение об именах и придерживайтесь его. Я использую то, что имя, такое как MAX_CAPACITY
, будет использоваться для поля static final
(то есть константа, такая как значение по умолчанию), и что эквивалентное поле экземпляра будет maxCapacity
Имена, такие как mAX_CAPACITY
, будут быть прямо вне вопроса.
См .: Соглашения Oracle о присвоении имен для Java
Вместо использования перечисления ComparisonWay
я бы взял пользовательский Comparator
. Гораздо более гибок и не воспроизводит то, что уже существует.
См .: Документация API Comparator
Ваш код, как написано, не является потокобезопасным. В частности, наблюдаемый элемент, вызывающий несинхронизированный метод update
, может, таким образом, вызывать sortArray
без получения надлежащей блокировки. FindBugs - отличный инструмент, который улавливает множество подобных проблем.
Ваш ObservableSample
на самом деле не следует передовым методам в отношении того, как он реализует Comparable
, в том смысле, что он действительно не сравнивает значения данных, а вместо этого hashCode. Хэш-код является по существу произвольным, и коллизии вполне возможны. Кроме того, интерфейс Comparable
запрашивает, чтобы вы, как правило, были «согласованы с Equals», для чего вам также может потребоваться взглянуть на документацию для метода equals класса Object
Да, это звучит как большая работа, но если вы пройдете через это и сделаете это правильно, вы сэкономите изумительное количество усилий по отладке в будущем. Если вы не сделаете это должным образом и в соответствии со спецификацией, вы обнаружите, что, когда вы помещаете это в Set
s или Map
s, ваши ключи или значения странным образом исчезают, появляются вновь или ударяются. И это будет зависеть от того, какую версию Java вы используете, потенциально!