שינוי הגישה של Java 'מוגן'

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

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

2. ה מוּגָן מילת מפתח

בעוד שאלמנטים הוכרזו כ- פְּרָטִי ניתן לגשת רק על ידי המחלקה בה הם מוכרזים, ה- מוּגָן מילת המפתח מאפשרת גישה מחלקות משנה ומחברי אותה חבילה.

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

3. הצהרה מוּגָן שדות, שיטות ובונים

ראשית, בואו ניצור aכיתה בשם מחלקה ראשונה המכיל a מוּגָן שדה, שיטה ובונה:

מחלקה ציבורית FirstClass {שם מחרוזת מוגן; FirstClass מוגן (שם מחרוזת) {this.name = שם; } מוגן מחרוזת getName () {שם החזרה; }}

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

4. גישה מוּגָן שדות, שיטות ובונים

4.1 מאותה חבילה

עכשיו, בואו נראה איך אנחנו יכולים לגשת מוּגָן שדות על ידי יצירת חדש GenericClass הוכרזה באותה חבילה כמו מחלקה ראשונה:

class class GenericClass {public static void main (String [] args) {FirstClass first = new FirstClass ("שם אקראי"); System.out.println ("שם FirstClass הוא" + first.getName ()); first.name = "שם חדש"; }}

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

4.2. מחבילה אחרת

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

class class SecondGenericClass {main public public static public (String [] args) {FirstClass first = First First Class ("שם אקראי"); System.out.println ("שם FirstClass הוא" + first.getName ()); first.name = "שם חדש"; }}

כמו שאנו יכולים לראות, אנו מקבלים שגיאות אוסף:

הקונסטרוקטור FirstClass (String) אינו גלוי השיטה getName () מהסוג FirstClass אינו גלוי השדה FirstClass.name אינו גלוי

זה בדיוק מה שציפינו באמצעות ה- מוּגָן מילת מפתח. זה בגלל ש SecondGenericClass אינו באותה חבילה כמו מחלקה ראשונה ואינו מחלק אותו משנה.

4.3 מתת-מחלקה

בוא נראה עכשיו מה קורה כשאנחנו מצהירים שיעור שמתארך מחלקה ראשונה אך הוכרז בחבילה אחרת:

מחלקה ציבורית SecondClass מרחיבה FirstClass {public SecondClass (שם מחרוזת) {סופר (שם); System.out.println ("שם המחלקה השנייה הוא" + this.getName ()); this.name = "שם חדש"; }}

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

5. מוּגָן כיתה פנימית

בדוגמאות הקודמות ראינו מוּגָן שדות, שיטות ובונים בפעולה. יש עוד מקרה מסוים אחד - א מוּגָן מעמד פנימי.

בואו ניצור את המעמד הפנימי הריק הזה בתוך שלנו מחלקה ראשונה:

חבילה com.baeldung.core.modifiers; מחלקה ציבורית FirstClass {// ... מחלקה סטטית מוגנת InnerClass {}}

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

5.1 מאותה חבילה

כדי לבדוק זאת, בואו נערוך את GenericClass:

class class GenericClass {public static void main (String [] args) {// ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass (); }}

כפי שאנו רואים, אנו יכולים לייצר את InnerClass בלי שום בעיה כי GenericClass נמצא באותה חבילה כמו מחלקה ראשונה.

5.2. מחבילה אחרת

בואו ננסה ליצור רגע InnerClass משלנו SecondGenericClass אשר, כזכור, הוא בחוץ מחלקה ראשונה' חֲבִילָה:

מחלקה ציבורית SecondGenericClass {public static void main (String [] args) {// ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass (); }}

כצפוי, אנו מקבלים שגיאת אוסף:

הסוג FirstClass.InnerClass אינו גלוי

5.3. מתת-מחלקה

בואו ננסה לעשות את אותו הדבר משלנו מחלקה שניה:

מחלקה ציבורית SecondClass מרחיבה FirstClass {public SecondClass (שם מחרוזת) {// ... FirstClass.InnerClass innerClass = חדש FirstClass.InnerClass (); }}

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

הבנאי FirstClass.InnerClass () אינו גלוי

בואו נסתכל על שלנו InnerClass הַצהָרָה:

מחלקה סטטית מוגנת InnerClass {}

הסיבה העיקרית שאנו מקבלים את השגיאה הזו היא ש קונסטרוקטור ברירת המחדל של א מוּגָן הכיתה היא באופן מרומז מוּגָן. בנוסף, מחלקה שניההוא תת-מחלקה של FirstClass אך אינו תת-מחלקה של InnerClass. סוף כל סוף, הכרזנו גם כןמחלקה שניה בחוץ מחלקה ראשונה' חֲבִילָה.

מכל הסיבות הללו, מחלקה שניה לא יכול לגשת ל מוּגָןInnerClass בַּנַאִי.

אם היינו רוצים כדי לפתור בעיה זו ולאפשר את שלנו מחלקה שניה ליצור אינסטנט InnerClass לְהִתְנַגֵד, נוכל להכריז במפורש על בונה ציבורי:

מחלקה סטטית מוגנת InnerClass {public InnerClass () {}}

על ידי כך, אנו כבר לא מקבלים שגיאת אוסף, ועכשיו אנו יכולים להפעיל InnerClass מ מחלקה שניה.

6. מסקנה

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

כמו תמיד, קוד הדוגמה זמין ב- GitHub.