Nouveau sur Java. Apprendre en travaillant sur une application Android. J'implémente un comparateur pour trier une liste de fichiers et les documents Android --- disons qu'un comparateur doit implémenter Serializable:
Il est recommandé qu'un comparateur implémente Sérialisable.
Ceci est l'interface sérialisable ici .
Je veux juste trier une liste de fichiers. Pourquoi devrais-je implémenter cela ou quelle est la raison pour laquelle cela devrait être pour tout comparateur?
Ce n'est pas seulement une chose Android chose, le Java SDK a la même recommandation :
Remarque: C'est généralement une bonne idée pour les comparateurs d'implémenter également Java.io.Serializable, car ils peuvent être utilisés comme méthodes de commande dans des structures de données sérialisables (comme TreeSet, TreeMap). Pour que la structure de données soit sérialisée avec succès, le comparateur (s'il est fourni) doit implémenter Sérialisable.
L'idée est donc que parce qu'un TreeMap est sérialisable et que le TreeMap peut contenir un comparateur, il serait bon que le comparateur soit également sérialisable. Il en va de même pour tous les éléments de la collection.
Vous pouvez ignorer cela en toute sécurité, sauf si vous utilisez la sérialisation de cette manière.
Sérialisable est une interface vierge. Il ne contient aucune méthode. Donc, pour l'implémenter, tout ce que vous devez dire est implements Serializable
dans une classe. Ce n'est pas un énorme fardeau pour vous. Si vous étendez Comparator
, vous n'avez même pas besoin d'implémenter Serializable
parce que la super classe le fait pour vous, et alors vous n'avez rien à faire du tout pour implémenter Serializable
.
Quand quelque chose implémente Serializable
, cela signifie que l'objet peut être transformé à volonté en un tableau d'octets. Ceci est utilisé pour la transmission sur Internet, le stockage dans un fichier, etc. En gros, la façon dont la sérialisation fonctionne pour un objet, par défaut, est de prendre chaque objet référencé par l'objet que vous essayez de sérialiser, tournez chacun objet dans un tableau d'octets (c'est-à-dire invoquer la sérialisation de façon récursive) et concaténer les tableaux d'octets pour produire un tableau d'octets qui représente l'objet global.
Maintenant, pourquoi un Comparator
devrait-il implémenter Serializable
? Supposons que vous souhaitiez sérialiser un TreeMap
ou un autre Collection
commandé. Le but de la sérialisation est de fournir une représentation complète d'un objet. Les collections comme TreeMap
ont un objet Comparator
, donc pour pouvoir produire un tableau d'octets qui capture tous les aspects de ces collections, vous devez être en mesure d'enregistrer le Comparator
en tant que tableau d'octets également. Par conséquent, Comparator
doit être Serializable
pour que d'autres éléments puissent être correctement sérialisés.
Cela devrait vous aider: http://docs.Oracle.com/javase/7/docs/api/Java/util/Comparator.html
Remarque: C'est généralement une bonne idée pour les comparateurs d'implémenter Java.io.Serializable, car ils peuvent être utilisés comme méthodes de commande dans les structures de données sérialisables (comme TreeSet, TreeMap). Pour que la structure de données soit sérialisée avec succès, le comparateur (s'il est fourni) doit implémenter Sérialisable.
Pour sérialiser un objet en Java, ces deux conditions doivent être remplies:
Lorsqu'une structure de données utilise un comparateur et que vous souhaitez que cette structure de données soit sérialisable, le point 2 (mentionné ci-dessus) oblige le comparateur à implémenter sérialisable.
j'ai vu dans Java 5 API Lien vers Java 5 APT qui a déclaré qu'en implémentant Comparator ne signifie pas implémenter Serializable interface de toute façon, donc il faut explicitement faire attention pour obtenir Serializable dans une classe Comparator créée de façon habituelle