JavaRush /مدونة جافا /Random-AR /واجهات - علامات
dupliaka
مستوى
Санкт-Петербург

واجهات - علامات

نشرت في المجموعة
واجهات العلامة هي نمط تصميم مع التحقق من نوع وقت التشغيل الذي يسمح لك بربط واجهة وفئة. لفهم سبب ضرورة ذلك، فكر في مثال لوضع علامة على الفئة القابلة للتسلسل باستخدام علامة. لنفترض أننا بحاجة إلى حفظ حالة الكائن في الذاكرة، ثم نكون قادرين أيضًا على فك تشفير ما قمنا بحفظه. بعد ذلك، كما تقول، يمكننا تحويل الكائن إلى مجموعة من البتات. يمين. يمكننا استخدام طريقة بسيطة للكتابة على ملف باستخدام FileInputStream، ولكن هذا يكون مناسبًا فقط إذا كان هناك عدد قليل من الكائنات، ولكن ماذا لو كان هناك الكثير منها؟ هناك أداة تسلسل رائعة لهذا الغرض. القاعدة الأساسية عند استخدامه هي أن الكائن الذي يتم إجراء تسلسل له يجب أن يحتوي على كافة البيانات ولا يشير إلى كائنات أخرى. انظر إلى صفك "آها، الحقول ليست مرجعية ومن الجيد وضع علامة قابلة للتسلسل." وعندما تضعه، فهذا يعني أنه يمكن كتابة الكائنات التي حددتها في 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 على أنها قابلة للتسلسل. يحتوي على حقل معرف واحد وطرق الحصول/المجموعة المصاحبة. 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(). تمت الآن استعادة الكائن. بفضل حقيقة أن حقل "المعرف" لم يكن رابطًا، تمكنا من تحديد الفئة القابلة للتسلسل، والتي تحتوي على بياناتها بالكامل. بدلاً من إضافة وظائف التحقق من الصحة داخل فئتنا، تسمح لنا الرموز المميزة بتبسيط عملية التحقق من صحة الفئة.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION