בוני ג'אווה לעומת שיטות מפעל סטטיות

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

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

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

במדריך זה נדגיש את ה- היתרונות והחסרונות של שימוש בשיטות מפעל סטטיות לעומת בוני Java ישנים רגילים.

2. היתרונות של שיטות מפעל סטטיות על פני קונסטרוקטורים

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

"שקול שיטות מפעל סטטיות במקום קונסטרוקציות"

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

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

3. שיטות מפעל סטטיות ב- JDK

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

3.1. ה חוּט מעמד

בגלל הידוע חוּט בהתמחות, זה מאוד לא סביר שנשתמש ב- חוּט בונה כיתות ליצור חדש חוּט לְהִתְנַגֵד. למרות זאת, זה חוקי לחלוטין:

ערך מחרוזת = מחרוזת חדשה ("באלדונג");

במקרה זה, הקונסטרוקטור ייצור חדש חוּט אובייקט, שהוא ההתנהגות הצפויה.

לחלופין, אם נרצה ליצור חדש חוּט אובייקט בשיטת מפעל סטטיתנוכל להשתמש בכמה מהיישומים הבאים של ה- ערך של() שיטה:

ערך מחרוזת 1 = String.valueOf (1); ערך מחרוזת 2 = String.valueOf (1.0L); מחרוזת value3 = String.valueOf (נכון); ערך מחרוזת 4 = String.valueOf ('a'); 

יש כמה יישומים עמוסים מדי של ערך של(). כל אחד יחזיר חדש חוּט אובייקט, תלוי בסוג הטיעון שהועבר לשיטה (למשל. int, ארוך, בוליאני, לְהַשְׁחִיר, וכן הלאה).

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

3.2. ה אופציונאלי מעמד

דוגמא מסודרת נוספת לשיטות מפעל סטטיות ב- JDK היא ה- אופציונאלי מעמד. הכיתה הזאת מיישם כמה שיטות מפעל עם שמות די משמעותיים, כולל ריק(), שֶׁל(), ו ofNullable ():

ערך אופציונלי 1 = Optional.empty (); ערך אופציונלי 2 = Optional.of ("Baeldung"); ערך אופציונלי 3 = Optional.ofNullable (null);

3.3. ה אוספים מעמד

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

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

להלן מספר דוגמאות אופייניות לשיטות המפעל של הכיתה:

אוסף syncedCollection = Collections.synchronizedCollection (originalCollection); הגדר syncedSet = Collections.synchronizedSet (חדש HashSet ()); List unmodifiableList = Collections.unmodifiableList (originalList); מפה unmodifiableMap = Collections.unmodifiableMap (originalMap); 

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

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

4. שיטות מפעל סטטיות בהתאמה אישית

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

בואו נראה דוגמה פשוטה.

בואו נשקול את זה נאיבי מִשׁתַמֵשׁ מעמד:

משתמש בכיתה ציבורית {private final שם מחרוזת; דוא"ל מחרוזת סופי פרטי; גמר פרטי מדינה מחרוזת; משתמש ציבורי (שם מחרוזת, מייל מחרוזת, ארץ מחרוזת) {this.name = name; this.email = דוא"ל; this.country = מדינה; } // getters סטנדרטי / toString}

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

מה אם אנחנו רוצים את כל זה מִשׁתַמֵשׁ מקרים מקבלים ערך ברירת מחדל עבור ה- מדינה שדה?

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

נוכל להשתמש בשיטת מפעל סטטית במקום:

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

כך נקבל מִשׁתַמֵשׁ מופע עם ערך ברירת מחדל שהוקצה ל- מדינה שדה:

משתמש משתמש = User.createWithDefaultCountry ("ג'ון", "[דוא"ל מוגן]");

5. העברת לוגיקה מחוץ לבונים

שֶׁלָנוּ מִשׁתַמֵשׁ class עלול להירקב במהירות לתכנון לקוי אם נחליט ליישם תכונות שידרשו להוסיף לוגיקה נוספת לבנאי (פעמוני אזעקה אמורים להישמע כבר בשלב זה).

נניח שאנחנו רוצים לספק לכיתה את היכולת לרשום את הזמן שבו כל מִשׁתַמֵשׁ נוצר אובייקט.

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

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

מחלקה ציבורית משתמש {לוגרית סופית סטטית פרטית LOGGER = Logger.getLogger (User.class.getName ()); פרטי סופי מחרוזת; דוא"ל מחרוזת סופי פרטי; גמר פרטי מדינה מחרוזת; // קונסטרוקטורים / גטרים סטנדרטיים משתמשים סטטיים ציבוריים createWithLoggedInstantiationTime (שם מחרוזת, דוא"ל מחרוזת, מדינה מחרוזת) {LOGGER.log (Level.INFO, "יצירת מופע משתמש ב-: {0}", LocalTime.now ()); להחזיר משתמש חדש (שם, דוא"ל, מדינה); }} 

כך היינו יוצרים את השיפור שלנו מִשׁתַמֵשׁ למשל:

משתמש משתמש = User.createWithLoggedInstantiationTime ("ג'ון", "[דוא"ל מוגן]", "ארגנטינה");

6. מיידיות נשלטת על ידי המופע

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

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

מחלקה ציבורית משתמש {מופע משתמש סטטי נדיף פרטי = null; // שדות אחרים / בונים סטנדרטיים / גטרים משתמשים סטטיים ציבוריים getSingletonInstance (שם מחרוזת, מייל מחרוזת, מדינה מחרוזת) {if (מופע == null) {מסונכרן (User.class) {if (מופע == null) {מופע = חדש משתמש (שם, דוא"ל, מדינה); }}} להחזיר מופע; }} 

יישום ה- getSingletonInstance () השיטה היא חוט בטוח, עם עונש ביצוע קטן, בגלל החסימה המסונכרנת.

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

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

כצפוי, מקבל מִשׁתַמֵשׁ אובייקט בשיטה זו נראה דומה מאוד לדוגמאות הקודמות:

משתמש משתמש = User.getSingletonInstance ("ג'ון", "[מוגן בדוא"ל]", "ארגנטינה");

7. מסקנה

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

יתר על כן, דפוס השיקום הזה נעוץ כל כך בזרימת עבודה אופיינית שרוב ה- IDE יעשו זאת עבורנו.

כמובן, אפאצ'י NetBeans, IntelliJ IDEA ו- Eclipse יבצעו את הרפקטורציה בדרכים מעט שונות, אז אנא הקפד לבדוק תחילה את תיעוד ה- IDE שלך.

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

כרגיל, כל דגימות הקוד המוצגות במאמר זה זמינות ב- GitHub.


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