JavaRush /בלוג Java /Random-HE /ממשקים - סמנים
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 כבר מסומנת כ-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 שהוזכר כבר ומעבירים אליו את ה-buffer, אנו כותבים את האובייקט שלנו לזרם וסוגרים אותו.

קריאת חפץ

בואו נכין מאגר כתיבה readBuffer, נעבור inputStream, קרא readObject(). האובייקט שוחזר כעת. הודות לעובדה ששדה `id` לא היה קישור, הצלחנו לסמן את המחלקה Serializable, המכילה את הנתונים שלה במלואם. במקום להוסיף פונקציות אימות בתוך המחלקה שלנו, אסימונים מאפשרים לנו לפשט את תהליך אימות המחלקה.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION