JavaRush /Java-Blog /Random-DE /Schnittstellen - Marker
dupliaka
Level 29
Санкт-Петербург

Schnittstellen - Marker

Veröffentlicht in der Gruppe Random-DE
Markierungsschnittstellen sind ein Entwurfsmuster mit Laufzeit-Typprüfung, mit dem Sie eine Schnittstelle und eine Klasse verknüpfen können. Um zu verstehen, warum dies notwendig sein könnte, betrachten Sie ein Beispiel für die Markierung der Serializible-Klasse mit einer Markierung. Nehmen wir an, wir müssten den Zustand eines Objekts im Speicher speichern und dann auch in der Lage sein, das Gespeicherte zu entschlüsseln. Dann, sagen Sie, können wir unser Objekt in eine Menge von Bits umwandeln. Rechts. Mit FileInputStream können wir auf einfache Weise in eine Datei schreiben. Dies ist jedoch nur praktisch, wenn nur wenige Objekte vorhanden sind. Was aber, wenn es viele davon gibt? Dafür gibt es ein wunderbares Serialisierungstool. Die Hauptregel bei der Verwendung lautet, dass das zu serialisierende Objekt alle Daten enthalten muss und nicht auf andere Objekte verweisen darf. Schauen Sie sich Ihre Klasse an: „Aha, die Felder werden nicht referenziert und es ist gut, die Markierung Serialisierbar zu setzen.“ Und wenn Sie es angeben, bedeutet dies, dass die von Ihnen markierten Objekte in ObjectOutputStream geschrieben werden können. Die ObjectOutputStream-Klasse verfügt über eine writeObject0()-Methode und enthält Prüfinstanzen, die prüfen, ob das Objekt geschrieben werden kann. Wenn die gesamte Prüfreihe fehlschlägt, wird eine NotSerializableException-Ausnahme ausgelöst, und wenn nicht, wird alles sauber in den Speicher geschrieben. Erstellen wir eine BigObject-Klasse, deren Instanzen wir serialisieren. 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; } } Die BigObject-Klasse ist bereits als Serialisierbar markiert. Es verfügt über ein ID-Feld und zugehörige Get/Set-Methoden. 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"); } }

Aufnahme eines Objekts

Zuerst erstellen wir ein Objekt der serialisierbaren Klasse BigObject und bereiten dann einen Datenpuffer dafür vor – den Ort, an dem wir alle Bögen ByteArrayOutputStream ablegen. Dann bereiten wir den bereits erwähnten ObjectOutputStream vor und übergeben ihm den Puffer. Wir schreiben unser Objekt in den Stream und schließen ihn.

Ein Objekt lesen

Bereiten wir einen Schreibpuffer readBuffer vor, übergeben wir inputStream und lesen readObject(). Das Objekt wurde nun wiederhergestellt. Dank der Tatsache, dass das Feld „id“ kein Link war, konnten wir die Klasse Serializable markieren, die ihre Daten vollständig enthält. Anstatt Validierungsfunktionen innerhalb unserer Klasse hinzuzufügen, ermöglichen uns Token, den Prozess der Klassenvalidierung zu vereinfachen.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION