Подтвердить что ты не робот

Почему компаратор реализует Serializable?

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

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

Это интерфейс Serializable здесь.

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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