واجهات العلامة هي نمط تصميم مع التحقق من نوع وقت التشغيل الذي يسمح لك بربط واجهة وفئة. لفهم سبب ضرورة ذلك، فكر في مثال لوضع علامة على الفئة القابلة للتسلسل باستخدام علامة. لنفترض أننا بحاجة إلى حفظ حالة الكائن في الذاكرة، ثم نكون قادرين أيضًا على فك تشفير ما قمنا بحفظه. بعد ذلك، كما تقول، يمكننا تحويل الكائن إلى مجموعة من البتات. يمين. يمكننا استخدام طريقة بسيطة للكتابة على ملف باستخدام 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"); } }
GO TO FULL VERSION