Le interfacce marcatore sono un modello di progettazione con controllo del tipo in fase di esecuzione che consente di associare un'interfaccia e una classe. Per capire perché ciò potrebbe essere necessario, si consideri l'esempio di come contrassegnare la classe Serializible con un marcatore. Supponiamo di dover salvare lo stato di un oggetto in memoria e quindi anche di poter decrittografare ciò che abbiamo salvato. Quindi, dici, possiamo convertire il nostro oggetto in un insieme di bit. Giusto. Possiamo usare un modo semplice per scrivere su un file usando FileInputStream, ma questo è conveniente solo se ci sono pochi oggetti, ma cosa succede se ce ne sono molti? C'è un meraviglioso strumento di serializzazione per questo. La regola principale quando lo si utilizza è che l'oggetto da serializzare deve contenere tutti i dati e non fare riferimento ad altri oggetti. Guarda la tua classe "Aha, i campi non hanno riferimenti ed è bello mettere il marcatore Serializzabile." E quando lo inserirai, significherà che gli oggetti che hai contrassegnato possono essere scritti su ObjectOutputStream. La classe ObjectOutputStream ha un metodo writeObject0() e contiene istanze di controlli che controllano se l'oggetto può essere scritto e se l'intera serie di controlli fallisce, viene generata un'eccezione NotSerializableException e, in caso contrario, tutto viene scritto correttamente in memoria. Creiamo una classe BigObject, di cui serializzeremo le istanze.
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 è già contrassegnata come Serializable. Ha un campo ID e metodi get/set associati. 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"); } }
GO TO FULL VERSION