JavaRush /Blogue Java /Random-PT /Interfaces - marcadores
dupliaka
Nível 29
Санкт-Петербург

Interfaces - marcadores

Publicado no grupo Random-PT
Interfaces de marcadores são um padrão de design com verificação de tipo em tempo de execução que permite associar uma interface e uma classe. Para entender por que isso pode ser necessário, considere um exemplo de marcação da classe Serializable com um marcador. Vamos supor que precisávamos salvar o estado de um objeto na memória e também poder descriptografar o que salvamos. Então, você diz, podemos converter nosso objeto em um conjunto de bits. Certo. Podemos usar uma maneira simples de gravar em um arquivo usando FileInputStream, mas isso só é conveniente se houver poucos objetos, mas e se houver muitos deles? Existe uma ferramenta de serialização maravilhosa para isso. A regra principal ao utilizá-lo é que o objeto que está sendo serializado deve conter todos os dados e não se referir a outros objetos. Olhe para sua classe “Aha, os campos não são referenciados e é bom colocar o marcador Serializable”. E quando você colocar isso, significará que os objetos que você marcou podem ser gravados em ObjectOutputStream. A classe ObjectOutputStream tem um método writeObject0() e contém verificações de instância que verificam se o objeto pode ser gravado e se toda a série de verificações falhar, então uma exceção NotSerializableException é lançada e, se não, tudo é gravado corretamente na memória. Vamos criar uma classe BigObject, cujas instâncias iremos serializar. 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; } } A classe BigObject já está marcada como Serializable. Possui um campo de identificação e métodos get/set que o acompanham. 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"); } }

Gravando um objeto

Primeiro, criamos um objeto da classe serializável BigObject, depois preparamos um buffer de dados para ele - o local onde colocaremos todos os arcos ByteArrayOutputStream. Em seguida, preparamos o já mencionado ObjectOutputStream e passamos o buffer para ele, escrevemos nosso objeto no stream e o fechamos.

Lendo um objeto

Vamos preparar um buffer de gravação readBuffer, passar inputStream, ler readObject(). O objeto agora foi restaurado. Graças ao fato do campo `id` não ser um link, conseguimos marcar a classe Serializable, que contém completamente seus dados. Em vez de adicionar funções de validação dentro de nossa classe, os tokens nos permitem simplificar o processo de validação de classe.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION