Есть ли способ добавить метаданные в коллекции Java? - PullRequest
4 голосов
/ 10 марта 2010

Допустим, у меня есть коллекция объектов, которые можно отсортировать с помощью ряда различных компараторов, основанных на разных полях объекта. Было бы неплохо позже узнать в коде, какой компаратор использовался для сортировки Коллекции и был ли он по возрастанию или по убыванию. Есть ли способ сделать это элегантно, вместо того, чтобы использовать кучу логических значений для отслеживания вещей?

Ответы [ 3 ]

2 голосов
/ 10 марта 2010

Не для интерфейса Collection, но если вы используете SortedSet , существует метод компаратора (), где вы можете запросить его компаратор.

В противном случае вам придется создать подкласс класса, который вы используете, чтобы добавить нужные средства доступа.

1 голос
/ 10 марта 2010

Нет, нет ничего с реализацией, которая делает это. Вы должны будете отслеживать это самостоятельно. Вы можете создать подкласс реализации Collection для добавления полей, содержащих эту информацию.

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

Я бы сохранил логическое значение (возрастание / убывание) и ссылку на компаратор, используемый для сортировки, если это то, что полностью определяет сортировку. Или, если он отсортирован по полю, возможно, сохраните строку с именем поля.

0 голосов
/ 10 марта 2010

уверен:

определить методы для вашего оформления Collection<Foo>

public List<Comparator<Foo>> getComparators() { ... }

и

public int whichComparator() { ... }

, который возвращает значение Comparator, которое в данный момент используется из List. Вы можете сделать его более привлекательным с помощью Map и некоторых разумных клавиш (скажем, перечислений - возможно, даже перечислений, которые реализуют компараторы), если вы изменяете, какие компараторы могут использоваться в течение срока службы объекта, но я думаю, что вышеизложенное достаточно хорошее начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...