رابط های نشانگر یک الگوی طراحی با بررسی نوع زمان اجرا هستند که به شما امکان می دهد یک رابط و یک کلاس را مرتبط کنید. برای درک اینکه چرا این ممکن است ضروری باشد، مثالی از علامت گذاری کلاس Serializible با یک نشانگر را در نظر بگیرید. بیایید فرض کنیم که باید وضعیت یک شی را در حافظه ذخیره کنیم و سپس بتوانیم آنچه را که ذخیره کرده ایم رمزگشایی کنیم. سپس، شما می گویید، ما می توانیم شی خود را به مجموعه ای از بیت ها تبدیل کنیم. درست. ما می توانیم از یک روش ساده برای نوشتن روی یک فایل با استفاده از FileInputStream استفاده کنیم، اما این کار فقط در صورتی راحت است که اشیاء کمی وجود داشته باشد، اما اگر تعداد آنها زیاد باشد چه؟ یک ابزار سریال سازی فوق العاده برای این کار وجود دارد. قانون اصلی زمانی که از آن استفاده می کنید این است که شی مورد سریال باید شامل تمام داده ها باشد و به اشیاء دیگر ارجاع نکند. به کلاس خود نگاه کنید "آها، فیلدها ارجاع داده نشده اند و خوب است که نشانگر Serializable را قرار دهید." و وقتی آن را قرار می دهید، به این معنی است که اشیایی که علامت گذاری کرده اید را می توان در ObjectOutputStream نوشت. کلاس ObjectOutputStream دارای یک متد writeObject0() است و شامل چکهای نمونهای است که بررسی میکند آیا شیء میتواند نوشته شود و اگر کل سری چکها با شکست مواجه شوند، یک استثنا 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 علامتگذاری شده است. دارای یک فیلد شناسه و متدهای دریافت/تنظیم همراه است. 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"); } }
GO TO FULL VERSION