JavaRush /Blog Java /Random-FR /Interfaces - marqueurs
dupliaka
Niveau 29
Санкт-Петербург

Interfaces - marqueurs

Publié dans le groupe Random-FR
Les interfaces de marqueurs sont un modèle de conception avec vérification de type à l'exécution qui vous permet d'associer une interface et une classe. Pour comprendre pourquoi cela peut être nécessaire, prenons un exemple de marquage de la classe Serializible avec un marqueur. Supposons que nous devions sauvegarder l'état d'un objet en mémoire, puis également pouvoir déchiffrer ce que nous avons enregistré. Ensuite, dites-vous, nous pouvons convertir notre objet en un ensemble de bits. Droite. Nous pouvons utiliser un moyen simple d'écrire dans un fichier en utilisant FileInputStream, mais cela n'est pratique que s'il y a peu d'objets, mais que se passe-t-il s'il y en a beaucoup ? Il existe un formidable outil de sérialisation pour cela. La règle principale lorsque vous l'utilisez est que l'objet en cours de sérialisation doit contenir toutes les données et ne pas faire référence à d'autres objets. Regardez votre classe "Aha, les champs ne sont pas référencés et c'est bien de mettre le marqueur Serialisable." Et lorsque vous le mettrez, cela signifiera que les objets que vous avez marqués pourront être écrits dans ObjectOutputStream. La classe ObjectOutputStream a une méthode writeObject0() et elle contient des vérifications d'instance qui vérifient si l'objet peut être écrit et si toute la série de vérifications échoue, une exception NotSerializingException est levée, et sinon, tout est soigneusement écrit en mémoire. Créons une classe BigObject dont nous allons sérialiser les instances. package post1; import java.io.Serializable; public class BigObject implements Serializable { private int id; public void setId(final int id){ this.id = id; } public int getId() { return id; } } La classe BigObject est déjà marquée comme Serialisable. Il comporte un champ d'identification et les méthodes get/set qui l'accompagnent. package post1; import post1.BigObject; import java.io.*; public class InterfaceMarker { public static void main(String[] args) throws IOException, ClassNotFoundException { int originalId = 12; BigObject objectOriginal = new BigObject(); objectOriginal.setId(originalId); ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream(); ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer); outputStream.writeObject(objectOriginal); outputStream.close(); byte[] buffer = writeBuffer.toByteArray(); ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer); ObjectInputStream inputStream = new ObjectInputStream(readBuffer); BigObject objectCopy = (BigObject)inputStream.readObject(); if (objectCopy.getId() == originalId) System.out.println( "originalId equals copiedId"); } }

Enregistrer un objet

Tout d'abord, nous créons un objet de la classe sérialisable BigObject, puis nous préparons un tampon de données pour celui-ci - l'endroit où nous placerons tous les arcs ByteArrayOutputStream. Ensuite, nous préparons l'ObjectOutputStream déjà mentionné et lui passons le tampon. Nous écrivons notre objet dans le flux et le fermons.

Lire un objet

Préparons un tampon d'écriture readBuffer, passons inputStream, lisons readObject(). L'objet a maintenant été restauré. Grâce au fait que le champ `id` n'était pas un lien, nous avons pu marquer la classe Serialisable, qui contient entièrement ses données. Au lieu d'ajouter des fonctions de validation à l'intérieur de notre classe, les jetons nous permettent de simplifier le processus de validation de classe.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION