Почему Comparator должен реализовывать Serializable? - PullRequest
39 голосов
/ 27 декабря 2011

Новое в Java. Изучение этого во время работы над приложением для Android. Я реализую Компаратор для сортировки списка файлов и документов Android Скажите , что Компаратор должен реализовать Serializable:

Рекомендуется, чтобы Comparator реализовывал Serializable.

Это Сериализуемый интерфейс здесь .

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

Ответы [ 5 ]

49 голосов
/ 27 декабря 2011

Это не просто Android, Java SDK имеет ту же рекомендацию :

Примечание. Как правило, компараторам также неплохо реализовать java.io.Serializable, так как они могут использоваться в качестве методов упорядочения в сериализуемых структурах данных (таких как TreeSet, TreeMap).Для успешной сериализации структуры данных компаратор (если имеется) должен реализовать Serializable.

Таким образом, идея состоит в том, что поскольку TreeMap сериализуем, а TreeMap может содержать Comparator, он будетхорошо, если компаратор также сериализуем.То же самое относится ко всем элементам в коллекции.

Вы можете смело игнорировать это, если не используете сериализацию таким образом.

9 голосов
/ 27 декабря 2011

Сериализуемый является пустым интерфейсом.Он не содержит никаких методов.Итак, для его реализации все, что вам нужно сказать, это implements Serializable в классе.Это не огромное бремя для вас.Если вы расширяете Comparator, вам даже не нужно реализовывать Serializable, потому что суперкласс делает это за вас, и тогда вам вообще не нужно ничего делать для реализации Serializable.

* 1006.* Когда что-то реализует Serializable, это означает, что объект может быть преобразован в байтовый массив по желанию.Это используется для передачи через Интернет, хранения в файле и т. Д. Говоря очень грубо, способ сериализации для объекта по умолчанию состоит в том, чтобы взять каждый объект, на который ссылается объект, который вы пытаетесь сериализовать, повернуть каждый такойОбъект в байтовый массив (т.е. рекурсивно вызывать сериализацию для него), и объединить байтовые массивы для создания байтового массива, который представляет общий объект.

Теперь, почему Comparator должен реализовывать Serializable?Допустим, вы хотите сериализовать TreeMap или какой-либо другой заказанный Collection.Цель сериализации - обеспечить полное представление объекта.Такие коллекции, как TreeMap, содержат в себе объект Comparator, поэтому, чтобы иметь возможность создавать байтовый массив, охватывающий каждый аспект таких коллекций, вы должны также иметь возможность сохранить Comparator как байтовый массив.Следовательно, Comparator должен быть Serializable, чтобы другие вещи могли быть правильно сериализованы.

9 голосов
/ 27 декабря 2011

Это должно вам помочь: http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

Примечание. Как правило, компараторам рекомендуется реализовывать java.io.Serializable, поскольку они могут использоваться в качестве методов упорядочения.в сериализуемых структурах данных (таких как TreeSet, TreeMap).Для успешной сериализации структуры данных компаратор (если имеется) должен реализовать Serializable.

3 голосов
/ 09 мая 2016

Чтобы сериализовать объект в Java, должны быть выполнены оба эти условия:

  1. Класс, к которому принадлежит экземпляр, должен реализовывать java.io.Serializable.
  2. Члены класса должны быть сериализуемыми. Если один или несколько элементов не подлежат сериализации, они должны быть помечены как временные.

Когда в какой-либо структуре данных используется компаратор, и вы хотите, чтобы эта структура данных была сериализуемой, пункт 2 (упомянутый выше) заставляет компаратор реализовать сериализуемый.

0 голосов
/ 05 июня 2013

я видел в Java 5 API Ссылка на java 5 APT , в которой говорилось, что реализация Comparator в любом случае не означает реализацию интерфейса Serializable, поэтому нужно обращать особое внимание на то, чтобы получить Serializable в некоторых обычносоздан класс компаратора

...