JavaRush /وبلاگ جاوا /Random-FA /رابط - نشانگر
dupliaka
مرحله
Санкт-Петербург

رابط - نشانگر

در گروه منتشر شد
رابط های نشانگر یک الگوی طراحی با بررسی نوع زمان اجرا هستند که به شما امکان می دهد یک رابط و یک کلاس را مرتبط کنید. برای درک اینکه چرا این ممکن است ضروری باشد، مثالی از علامت گذاری کلاس 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"); } }

ضبط یک شی

ابتدا یک شی از کلاس قابل سریال BigObject ایجاد می کنیم، سپس یک بافر داده برای آن آماده می کنیم - مکانی که تمام کمان های ByteArrayOutputStream را در آن قرار می دهیم. سپس ObjectOutputStream که قبلا ذکر شد را آماده می کنیم و بافر را به آن پاس می دهیم و شی خود را روی استریم می نویسیم و آن را می بندیم.

خواندن یک شی

بیایید یک بافر نوشتن readBuffer آماده کنیم، inputStream را پاس کنیم، readObject() را بخوانیم. اکنون شیء بازسازی شده است. با تشکر از این واقعیت که فیلد «id» یک پیوند نبود، ما توانستیم کلاس Serializable را علامت گذاری کنیم که کاملاً حاوی داده های آن است. به جای اضافه کردن توابع اعتبار سنجی در کلاس خود، توکن ها به ما اجازه می دهند فرآیند اعتبار سنجی کلاس را ساده کنیم.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION