Interfejsy znaczników to wzorzec projektowy ze sprawdzaniem typu w czasie wykonywania, który umożliwia powiązanie interfejsu i klasy. Aby zrozumieć, dlaczego może to być konieczne, rozważmy przykład oznaczenia klasy Serializible znacznikiem. Załóżmy, że musieliśmy zapisać stan obiektu w pamięci, a następnie móc także odszyfrować to, co zapisaliśmy. Następnie, mówisz, możemy przekształcić nasz obiekt w zestaw bitów. Prawidłowy. Możemy zastosować prosty sposób zapisu do pliku za pomocą FileInputStream, ale jest to wygodne tylko wtedy, gdy obiektów jest niewiele, ale co, jeśli jest ich wiele? Jest do tego wspaniałe narzędzie do serializacji. Główną zasadą podczas jej używania jest to, że serializowany obiekt musi zawierać wszystkie dane i nie może odnosić się do innych obiektów. Spójrz na swoją klasę: „Aha, do pól nie ma odniesienia i dobrze jest umieścić znacznik Serializable”. A kiedy to umieścisz, będzie to oznaczać, że zaznaczone obiekty można zapisać w ObjectOutputStream. Klasa ObjectOutputStream ma metodę writeObject0() i zawiera kontrole instancji, które sprawdzają, czy obiekt może zostać zapisany, a jeśli cała seria kontroli zakończy się niepowodzeniem, zgłaszany jest wyjątek NotSerializableException, a jeśli nie, wszystko jest starannie zapisywane w pamięci. Stwórzmy klasę BigObject, której instancje będziemy serializować.Klasa
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; } }
BigObject jest już oznaczona jako Serializable. Ma jedno pole identyfikatora i towarzyszące mu metody get/set. 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