JavaRush /จาวาบล็อก /Random-TH /อินเทอร์เฟซ - เครื่องหมาย
dupliaka
ระดับ
Санкт-Петербург

อินเทอร์เฟซ - เครื่องหมาย

เผยแพร่ในกลุ่ม
อินเทอร์เฟซของมาร์กเกอร์คือรูปแบบการออกแบบที่มีการตรวจสอบประเภทรันไทม์ที่ช่วยให้คุณสามารถเชื่อมโยงอินเทอร์เฟซและคลาสได้ เพื่อให้เข้าใจว่าเหตุใดจึงจำเป็น ลองพิจารณาตัวอย่างการทำเครื่องหมายคลาส Serializible ด้วยเครื่องหมาย สมมติว่าเราจำเป็นต้องบันทึกสถานะของออบเจ็กต์ไว้ในหน่วยความจำ จากนั้นจึงสามารถถอดรหัสสิ่งที่เราบันทึกไว้ได้ จากนั้นคุณบอกว่าเราสามารถแปลงวัตถุของเราให้เป็นชุดบิตได้ ขวา. เราสามารถใช้วิธีง่ายๆ ในการเขียนไฟล์โดยใช้ 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 ถูกทำเครื่องหมายเป็น Serializable แล้ว โดยมีช่องรหัสเดียวและมีเมธอด 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"); } }

การบันทึกวัตถุ

ขั้นแรก เราสร้างอ็อบเจ็กต์ของคลาส BigObject ที่สามารถซีเรียลไลซ์ได้ จากนั้นเราจะเตรียมบัฟเฟอร์ข้อมูลสำหรับมัน - ตำแหน่งที่เราจะวางส่วนโค้ง ByteArrayOutputStream ทั้งหมด จากนั้นเราก็เตรียม ObjectOutputStream ที่กล่าวไปแล้วและส่งบัฟเฟอร์ไปให้ เราเขียน object ของเราไปที่ stream แล้วปิดมัน

การอ่านวัตถุ

มาเตรียมบัฟเฟอร์การเขียน readBuffer, ส่งผ่าน inputStream, อ่าน readObject() ขณะนี้วัตถุได้รับการกู้คืนแล้ว เนื่องจากช่อง `id` ไม่ใช่ลิงก์ เราจึงสามารถทำเครื่องหมายคลาส Serializable ได้ ซึ่งมีข้อมูลครบถ้วน แทนที่จะเพิ่มฟังก์ชันการตรวจสอบภายในคลาสของเรา โทเค็นช่วยให้เราทำให้กระบวนการตรวจสอบความถูกต้องของคลาสง่ายขึ้น
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION