אובייקטים בלתי ניתנים לשינוי בג'אווה

1. סקירה כללית

במדריך זה נלמד מה הופך אובייקט לבלתי משתנה, כיצד להשיג אי-שינוי במערכת Java ואילו יתרונות נובעים מכך.

2. מהו חפץ בלתי-משתנה?

אובייקט בלתי משתנה הוא אובייקט שמצבו הפנימי נשאר קבוע לאחר שנוצר לחלוטין.

המשמעות היא שממשק ה- API הציבורי של אובייקט בלתי משתנה מבטיח לנו שהוא יתנהג באותה צורה במהלך כל חייו.

אם נסתכל בכיתה חוּט, אנו יכולים לראות שגם כאשר נראה כי ה- API שלו מספק לנו התנהגות ניתנת לשינוי החלף השיטה, המקורי חוּט לא משתנה:

שם מחרוזת = "baeldung"; מחרוזת newName = name.replace ("זבל", "----"); assertEquals ("baeldung", שם); assertEquals ("bael ----", newName);

ה- API נותן לנו שיטות לקריאה בלבד, לעולם אסור לכלול שיטות המשנות את המצב הפנימי של האובייקט.

3. ה סופי מילת מפתח בג'אווה

לפני שננסה להשיג אי-שינוי במערכת Java, עלינו לדבר על ה- סופי מילת מפתח.

בג'אווה, משתנים ניתנים לשינוי כברירת מחדל, כלומר אנו יכולים לשנות את הערך שהם מחזיקים.

באמצעות סופי מילת המפתח בעת הכרזת משתנה, מהדר Java לא מאפשר לנו לשנות את הערך של אותו משתנה. במקום זאת, הוא ידווח על שגיאת זמן הידור:

שם מחרוזת סופי = "baeldung"; שם = "בעל ...";

ציין זאת סופי רק אוסר עלינו לשנות את ההפניה שהמשתנה מחזיק, זה לא מגן עלינו מפני שינוי המצב הפנימי של האובייקט אליו הוא מתייחס באמצעות ה- API הציבורי שלו:

מחרוזות רשימה סופיות = ArrayList חדש (); assertEquals (0, strings.size ()); strings.add ("באלדונג"); assertEquals (0, strings.size ());

השני assertEquals ייכשל מכיוון שהוספת אלמנט לרשימה משנה את גודלו, ולכן זה לא אובייקט שניתן לשנות.

4. אי-משתנות בג'אווה

כעת, כשאנחנו יודעים כיצד למנוע שינויים בתוכן של משתנה, נוכל להשתמש בו לבניית ה- API של אובייקטים בלתי ניתנים לשינוי.

בניית ה- API של אובייקט שאינו משתנה מחייבת אותנו להבטיח שמצבו הפנימי לא ישתנה ולא משנה כיצד אנו משתמשים ב- API שלו.

צעד קדימה בכיוון הנכון הוא להשתמש סופי כאשר מצהירים על תכונותיו:

כסף בכיתה {סכום כפול פרטי סופי; מטבע מטבע סופי פרטי; // ...}

שים לב שג'אווה מבטיחה לנו שהערך של כמות לא ישתנה, זה המקרה עם כל משתני הסוגים הפרימיטיביים.

עם זאת, בדוגמה שלנו מובטח לנו רק שה- מַטְבֵּעַ לא ישתנה, אז עלינו להסתמך על מַטְבֵּעַ API להגנה מפני שינויים.

לרוב, אנו זקוקים לתכונות של אובייקט כדי להחזיק ערכים מותאמים אישית, והמקום לאתחול המצב הפנימי של אובייקט בלתי משתנה הוא הבנאי שלו:

class class {// ... כסף ציבורי (סכום כפול, מטבע מטבע) {this.amount = סכום; this.currency = מטבע; } מטבע ציבורי getCurrency () {מטבע החזרה; } getAmount כפול ציבורי () {סכום החזר; }}

כפי שאמרנו בעבר, כדי לענות על הדרישות של ממשק API ללא שינוי, שלנו כֶּסֶף בכיתה יש רק שיטות לקריאה בלבד.

באמצעות ממשק ה- API של ההשתקפות, אנו יכולים לשבור אי-משתנות ולשנות אובייקטים בלתי ניתנים לשינוי. עם זאת, השתקפות מפרה את ה- API הציבורי של האובייקט הבלתי משתנה, ובדרך כלל עלינו להימנע מלעשות זאת.

5. יתרונות

מכיוון שמצבו הפנימי של אובייקט בלתי משתנה נשאר קבוע בזמן, אנו יכולים לשתף אותו בבטחה בין מספר אשכולות.

אנו יכולים להשתמש בו גם באופן חופשי, ואף אחד מהאובייקטים המתייחסים אליו לא יבחין בהבדל, אנו יכולים לומר זאת עצמים בלתי ניתנים לשינוי הם ללא תופעות לוואי.

6. מסקנה

עצמים בלתי ניתנים לשינוי אינם משנים את מצבם הפנימי בזמן, הם בטוחים בחוטים וללא תופעות לוואי. בגלל מאפיינים אלה, אובייקטים בלתי ניתנים לשינוי שימושי במיוחד גם כאשר מתמודדים עם סביבות מרובות תבריג.

תוכל למצוא את הדוגמאות המשמשות במאמר זה ב- GitHub.