Java 14 מילת מפתח רשומה

1. הקדמה

העברת נתונים בלתי ניתנים לשינוי בין אובייקטים היא אחת המשימות הנפוצות ביותר, אך שגרתיות ביישומי Java רבים.

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

עם שחרורו של Java 14, כעת אנו יכולים להשתמש ברשומות כדי לתקן בעיות אלה.

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

2. מטרה

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

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

כדי להשיג זאת, אנו יוצרים שיעורי נתונים עם הדברים הבאים:

  1. פְּרָטִי, סופי שדה עבור כל פיסת נתונים
  2. גטר לכל תחום
  3. פּוּמְבֵּי קונסטרוקטור עם טיעון מקביל לכל תחום
  4. שווים שיטה שחוזרת נָכוֹן לאובייקטים מאותה מחלקה כאשר כל השדות תואמים
  5. hashCode שיטה שמחזירה את אותו ערך כאשר כל השדות תואמים
  6. toString שיטה הכוללת את שם המחלקה ואת השם של כל שדה ואת הערך המתאים לו

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

אדם בכיתה ציבורית {פרטי סופי שם מחרוזת; כתובת מחרוזת סופית פרטית; אדם ציבורי (שם מחרוזת, כתובת מחרוזת) {this.name = שם; כתובת זו: כתובת; } @Override public int hashCode () {return Objects.hash (שם, כתובת); } @ עקוף בוליאני ציבורי שווה (אובייקט אובייקט) {אם (זה == אובייקט) {להחזיר נכון; } אחרת אם (! (obj למשל של אדם)) {return false; } אחר {אדם אחר = (אדם) אובייקט; להחזיר Objects.equals (שם, אחר.שם) && Objects.equals (כתובת, כתובת אחרת); }} @ עקירה ציבורית מחרוזת toString () {להחזיר "אדם [שם =" + שם + ", כתובת =" + כתובת + "]"; } // גטרים סטנדרטיים}

אמנם זה משיג את מטרתנו, אך יש בכך שתי בעיות:

  1. יש הרבה קוד boilerplate
  2. אנו מטשטשים את מטרת הכיתה שלנו - לייצג אדם עם שם וכתובת

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

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

במקרה השני, הקוד הנוסף מסתיר שהמחלקה שלנו היא פשוט מחלקת נתונים שיש לו שניים חוּט שדות: שֵׁם ו כתובת.

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

3. היסודות

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

ה שווים, hashCode, ו toString שיטות, כמו גם את פְּרָטִי, סופי שדות, ו פּוּמְבֵּי קונסטרוקטור, נוצרים על ידי מהדר Java.

ליצור אדם , אנו משתמשים ב- תקליט מילת מפתח:

אדם רשומה ציבורית (שם מחרוזת, כתובת מחרוזת) {}

3.1. בַּנַאִי

באמצעות רשומות נוצר עבורנו קונסטרוקטור ציבורי - עם טיעון לכל תחום.

במקרה שלנו אדם רשומה, הבנאי המקביל הוא:

אדם ציבורי (שם מחרוזת, כתובת מחרוזת) {this.name = שם; כתובת זו: כתובת; }

בונה זה יכול לשמש באותו אופן כמו מחלקה להנחיית אובייקטים מתוך הרשומה:

אדם אדם = אדם חדש ("ג'ון דו", "100 לינדה נ.");

3.2. גטרס

אנו מקבלים גם שיטות גטריות ציבוריות - ששמותיהן תואמים לשם התחום שלנו - בחינם.

בשלנו אדם שיא, זה אומר א שֵׁם() ו כתובת() גטר:

@Test הציבור בטל givenValidNameAndAddress_whenGetNameAndAddress_thenExpectedValuesReturned () {שם מחרוזת = "ג'ון דו"; כתובת מחרוזת = "100 לינדה Ln."; אדם אדם = אדם חדש (שם, כתובת); assertEquals (שם, person.name ()); assertEquals (כתובת, person.address ()); }

3.3. שווים

בנוסף, an שווים נוצרת עבורנו שיטה.

שיטה זו חוזרת נָכוֹן אם האובייקט שסופק הוא מאותו סוג והערכים של כל השדות שלו תואמים:

@Test הציבורי בטל givenSameNameAndAddress_whenEquals_thenPersonsEqual () {שם מחרוזת = "ג'ון דו"; כתובת מחרוזת = "100 לינדה Ln."; אדם אדם 1 = אדם חדש (שם, כתובת); אדם אדם 2 = אדם חדש (שם, כתובת); assertTrue (person1.equals (person2)); }

אם אחד מהשדות שונה בין שניים אדם מקרים, ה שווים השיטה תחזור שֶׁקֶר.

3.4. hashCode

דומה לשלנו שווים שיטה, מקביל hashCode השיטה נוצרת גם עבורנו.

שֶׁלָנוּ hashCode שיטה מחזירה את אותו ערך לשניים אדם אובייקטים אם כל ערכי השדה עבור שני האובייקטים תואמים (חסימת התנגשויות בגלל פרדוקס יום ההולדת):

@Test הציבור בטל givenSameNameAndAddress_whenHashCode_thenPersonsEqual () {String name = "John Doe"; כתובת מחרוזת = "100 לינדה Ln."; אדם אדם 1 = אדם חדש (שם, כתובת); אדם אדם 2 = אדם חדש (שם, כתובת); assertEquals (person1.hashCode (), person2.hashCode ()); } 

ה hashCode הערך יהיה שונה אם אחד מערכי השדה שונה.

3.5. toString

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

לכן, מיידית א אדם עם שם של "פלוני אלמוני" וכתובת של "100 לינדה לן."מביא את הדברים הבאים toString תוֹצָאָה:

אדם [name = John Doe, address = 100 Linda Ln.]

4. קונסטרוקטורים

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

התאמה אישית זו נועדה לשמש לאימות ויש לשמור עליה פשוטה ככל האפשר.

לדוגמא, אנו יכולים להבטיח שה- שֵׁם ו כתובת מסופק שלנו אדם שיא אינם ריק באמצעות יישום הבנאי הבא:

אדם רשומה ציבורית (שם מחרוזת, כתובת מחרוזת) {אדם ציבורי {Objects.requireNonNull (שם); Objects.requireNonNull (כתובת); }}

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

רישום ציבורי אדם (שם מחרוזת, כתובת מחרוזת) {אדם ציבורי (שם מחרוזת) {זה (שם, "לא ידוע"); }}

כמו אצל בוני כיתות, ניתן להפנות לשדות באמצעות זֶה מילת מפתח (לדוגמה, זה שם ו זו. כתובת) ו הטיעונים תואמים את שם השדות (זה, שֵׁם ו כתובת).

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

רשומה ציבורית אדם (שם מחרוזת, כתובת מחרוזת) {אדם ציבורי (שם מחרוזת, כתובת מחרוזת) {this.name = שם; כתובת זו: כתובת; }}

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

לכן, הדברים הבאים לא יתכנסו:

אדם רשומה ציבורית (שם מחרוזת, כתובת מחרוזת) {אדם ציבורי {Objects.requireNonNull (שם); Objects.requireNonNull (כתובת); } אדם ציבורי (שם מחרוזת, כתובת מחרוזת) {this.name = שם; כתובת זו: כתובת; }}

5. משתנים ושיטות סטטיים

כמו בשיעורי Java רגילים, אנו יכולים לכלול ברשומות שלנו גם משתנים ושיטות סטטיים.

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

אדם רשומה ציבורית (שם מחרוזת, כתובת מחרוזת) {public static String UNKNOWN_ADDRESS = "לא ידוע"; }

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

רשומה ציבורית אדם (שם מחרוזת, כתובת מחרוזת) {אדם סטטי ציבורי ללא שם (כתובת מחרוזת) {להחזיר אדם חדש ("ללא שם", כתובת); }}

לאחר מכן נוכל להתייחס למשתנים סטטיים וגם לשיטות סטטיות באמצעות שם הרשומה:

Person.UNKNOWN_ADDRESS Person.unnamed ("100 לינדה Ln.");

6. מסקנה

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

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

את הקוד והדוגמאות למדריך זה ניתן למצוא באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found