JavaRush /Blog Java /Random-ES /Interfaces - marcadores
dupliaka
Nivel 29
Санкт-Петербург

Interfaces - marcadores

Publicado en el grupo Random-ES
Las interfaces de marcador son un patrón de diseño con verificación de tipos en tiempo de ejecución que le permite asociar una interfaz y una clase. Para entender por qué esto podría ser necesario, considere un ejemplo de cómo marcar la clase Serializable con un marcador. Supongamos que necesitábamos guardar el estado de un objeto en la memoria y luego también poder descifrar lo que guardamos. Entonces, dices, podemos convertir nuestro objeto en un conjunto de bits. Bien. Podemos usar una forma simple de escribir en un archivo usando FileInputStream, pero esto solo es conveniente si hay pocos objetos, pero ¿qué pasa si hay muchos? Existe una maravillosa herramienta de serialización para esto. La regla principal cuando lo usa es que el objeto que se serializa debe contener todos los datos y no hacer referencia a otros objetos. Mira tu clase "Ajá, los campos no están referenciados y es bueno poner el marcador Serializable". Y cuando lo pongas, significará que los objetos que marcaste se pueden escribir en ObjectOutputStream. La clase ObjectOutputStream tiene un método writeObject0() y contiene comprobaciones de instancia de que verifican si el objeto se puede escribir y, si toda la serie de comprobaciones falla, se genera una excepción NotSerializableException y, si no, todo se escribe claramente en la memoria. Creemos una clase BigObject, cuyas instancias serializaremos. 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 clase BigObject ya está marcada como Serializable. Tiene un campo de identificación y métodos get/set que lo acompañan. 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"); } }

Grabar un objeto

Primero, creamos un objeto de la clase serializable BigObject, luego preparamos un búfer de datos para él: el lugar donde colocaremos todos los arcos ByteArrayOutputStream. Luego preparamos el ObjectOutputStream ya mencionado y le pasamos el buffer, escribimos nuestro objeto en el flujo y lo cerramos.

Leer un objeto

Preparemos un búfer de escritura readBuffer, pasemos inputStream y leamos readObject (). El objeto ya ha sido restaurado. Gracias a que el campo `id` no era un enlace, pudimos marcar la clase Serializable, que contiene completamente sus datos. En lugar de agregar funciones de validación dentro de nuestra clase, los tokens nos permiten simplificar el proceso de validación de la clase.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION