JavaRush /Blog Java /Random-PL /Interfejsy - znaczniki
dupliaka
Poziom 29
Санкт-Петербург

Interfejsy - znaczniki

Opublikowano w grupie Random-PL
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"); } }

Nagrywanie obiektu

Najpierw tworzymy obiekt serializowalnej klasy BigObject, następnie przygotowujemy dla niego bufor danych – miejsce, w którym będziemy umieszczać wszystkie łuki ByteArrayOutputStream. Następnie przygotowujemy wspomniany już ObjectOutputStream i przekazujemy do niego bufor, zapisujemy nasz obiekt do strumienia i zamykamy go.

Czytanie obiektu

Przygotujmy bufor zapisu readBuffer, przekażmy inputStream, przeczytajmy readObject(). Obiekt został już odrestaurowany. Dzięki temu, że pole `id` nie było linkiem, mogliśmy oznaczyć klasę Serializable, która w całości zawiera jej dane. Zamiast dodawać funkcje walidacyjne wewnątrz naszej klasy, tokeny pozwalają nam uprościć proces walidacji klasy.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION