Інтерфейси – маркери – це такий шаблон проектування з перевіркою типів під час виконання, який дозволяє пов'язати інтерфейс та клас. Щоб зрозуміти для чого це може бути потрібно розглянемо приклад маркування класу Serializible маркером. Припустимо, нам знадобилося зберегти стан об'єкта у пам'яті, та був ще й мати можливість розшифрувати те, що ми зберегли. Тоді, скажіть, можна перевести наш об'єкт у набір бітів. Правильно. Ми можемо використовувати простий спосіб запису у файл за допомогою FileInputStream, але це зручно тільки якщо об'єктів мало, а якщо їх багато? Для цього є чудовий інструмент серіалізації. Головне правило, коли ви ним користуєтеся - об'єкт, що серіалізується, повинен містити в собі всі дані, а не посилатися на інші об'єкти. Дивіться свій клас " Ага, то викидається виняток NotSerializableException, а якщо ні-все акуратно пишеться в пам'ять. Створимо клас BigObject, екземпляри якого серіалізуватимемо то викидається виняток NotSerializableException, а якщо ні-все акуратно пишеться в пам'ять. Створимо клас BigObject, екземпляри якого серіалізуватимемо
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 вже позначений як Serializable. Він має одне поле id і супутні методи 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"); } }
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ