Javaの新機能。 Androidアプリで作業中にそれを学びます。ファイルのリストとAndroid docs say コンパレータがSerializableを実装する必要があること:
コンパレータがSerializableを実装することをお勧めします。
これはSerializableインターフェース here です。
ファイルのリストを並べ替えるだけです。なぜこれを実装する必要があるのですか、それがどのコンパレータにも必要なのはなぜですか?
これは単なるAndroid事ではありません Java SDKにも同じ推奨事項があります :
注:コンパレーターは、Java.io.Serializableも実装することをお勧めします。これは、コンパレーターが直列化可能なデータ構造(TreeSet、TreeMapなど)の順序付けメソッドとして使用される可能性があるためです。データ構造を正常にシリアル化するには、コンパレータ(提供されている場合)がSerializableを実装する必要があります。
つまり、TreeMapはシリアル化可能であり、TreeMapにコンパレータを含めることができるため、コンパレータもシリアル化可能であることが理想です。同じことがコレクション内のすべての要素に適用されます。
この方法でシリアル化を使用しない限り、これを無視しても問題ありません。
Serializeableは空のインターフェイスです。メソッドは含まれていません。したがって、それを実装するために言う必要があるのはimplements Serializable
クラス内。それはあなたにとって大きな負担ではありません。 Comparator
を拡張する場合、スーパークラスが代わりにSerializable
を実装する必要はなく、Serializable
を実装するために何もする必要はありません。
何かがSerializable
を実装する場合、それはオブジェクトを自由にバイト配列に変換できることを意味します。これは、インターネットを介した送信、ファイルへの保存などに使用されます。大まかに言えば、オブジェクトのシリアル化の動作は、デフォルトでは、シリアル化しようとしているオブジェクトが参照するすべてのオブジェクトを取得し、それぞれを順番にすることですオブジェクトをバイト配列に入れ(つまり、シリアライズを再帰的に呼び出します)、バイト配列を連結して、オブジェクト全体を表すバイト配列を生成します。
では、なぜComparator
がSerializable
を実装する必要があるのでしょうか。 TreeMap
またはその他の順序付けられたCollection
をシリアル化したいとします。直列化の目的は、オブジェクトの完全な表現を提供することです。 TreeMap
のようなコレクションにはComparator
オブジェクトが含まれているため、このようなコレクションのあらゆる側面をキャプチャするバイト配列を生成できるようにするには、Comparator
をバイト配列として保存する必要もあります。したがって、Comparator
をSerializable
にする必要があります。これにより、他のものを適切にシリアル化できます。
これはあなたを助けるはずです: http://docs.Oracle.com/javase/7/docs/api/Java/util/Comparator.html
注:コンパレータは、直列化可能なデータ構造(TreeSet、TreeMapなど)の順序付けメソッドとして使用できるため、Java.io.Serializableを実装することをお勧めします。データ構造を正常にシリアル化するには、コンパレータ(提供されている場合)がSerializableを実装する必要があります。
Javaでオブジェクトをシリアル化するには、次の両方の条件を満たす必要があります。
データ構造がコンパレータを使用していて、そのデータ構造をシリアル化可能にしたい場合、ポイント2(上記)は、コンパレータにシリアル化を実装するように強制します。
私はJava 5 API Link to Java 5 APT で見ましたが、コンパレータを実装することはSerializableを実装することを意味しないと述べましたいずれにせよインターフェイスなので、習慣的に作成されたComparatorクラスでSerializableを取得するには、明示的に注意を払う必要があります