מבוא למפעל אוטומטי

1. הקדמה

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

זהו מחולל קוד ברמת המקור המסייע בייצור מפעלים.

2. הגדרת Maven

לפני שנתחיל, בואו נוסיף את התלות הבאה ל- pom.xml:

 com.google.auto.factory אוטומטי-מפעל 1.0-בטא 5 

הגרסה האחרונה תוכל למצוא כאן.

3. התחלה מהירה

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

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

@ בכיתה ציבורית AutoFactory טלפון {מצלמת מצלמה פרטית סופית; גמר פרטי מחרוזת otherParts; PhoneAssembler (@ מצלמת מצלמה מסופקת, מחרוזת חלקים אחרים) {this.camera = מצלמה; this.otherParts = otherParts; } // ...}

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

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

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") מחלקת הגמר הציבורית PhoneFactory {פרטית הסופית הסופית cameraProvider; @Inject PhoneAssemblerFactory (ספקית cameraProvider) {this.cameraProvider = checkNotNull (cameraProvider, 1); } PhoneAssembler create (String otherParts) {להחזיר PhoneAssembler חדש (checkNotNull (cameraProvider.get (), 1), checkNotNull (otherParts, 2)); } // ...}

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

PhoneFactory phoneFactory = חדש PhoneFactory (() -> מצלמה חדשה ("לא ידוע", "XXX")); טלפון simplePhone = phoneFactory.create ("חלקים אחרים");

ה @ AutoFactory ניתן ליישם ביאור גם לבנאים:

מעמד ציבורי ClassicPhone {לוח סיום פרטי מחרוזת; גמר פרטי צלצול מחרוזת; פרטי מחרוזת otherParts; @AutoFactory ציבורי ClassicPhone (@Provided String dial, @Provided String ringer) {this.dialpad = dialpad; this.ringer = צלצול; } @ AutoFactory הציבורית ClassicPhone (String otherParts) {this ("defaultDialPad", "defaultRinger"); this.otherParts = otherParts; } // ...}

בקטע הקודם הגשנו בקשה @ AutoFactory לשני הבונים. מפעל אוטומטי פשוט ייצור עבורנו שתי שיטות יצירה בהתאם:

@Generated (value = "com.google.auto.factory.processor.AutoFactoryProcessor") מחלקת גמר ציבורית ClassicPhoneFactory {ספק גמר פרטי java_lang_StringProvider; @ הזריק ClassicPhoneFactory ציבורי (ספק java_lang_StringProvider) {this.java_lang_StringProvider = checkNotNull (java_lang_StringProvider, 1); } ליצור ClassicPhone ציבורי () {להחזיר ClassicPhone חדש (checkNotNull (java_lang_StringProvider.get (), 1), checkNotNull (java_lang_StringProvider.get (), 2)); } ליצור ClassicPhone ציבורי (מחרוזת otherParts) {להחזיר ClassicPhone חדש (checkNotNull (otherParts, 1)); } // ...}

מפעל אוטומטי תומך גם בפרמטרים עם הערות @ שסופק, אך רק להערות JSR-330.

לדוגמא, אם אנחנו רוצים את cameraProvider להיות "סוני", אנחנו יכולים לשנות את מכשיר טלפון כיתה ל:

@AutoFactory בכיתה ציבורית טלפון {PhoneAssembler (@Provided @Named ("Sony") מצלמת מצלמה, מחרוזת otherParts) {this.camera = מצלמה; this.otherParts = otherParts; } // ...}

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

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") מחלקת הגמר הציבורית PhoneFactory {פרטית הסופית הסופית cameraProvider; @Inject PhoneAssemblerFactory (@Named ("Sony") ספקית cameraProvider) {this.cameraProvider = checkNotNull (cameraProvider, 1); } // ...}

4. יצירת קוד מותאם אישית

ישנן מספר תכונות בהן אנו יכולים להשתמש @ AutoFactory ביאור להתאמה אישית של הקוד שנוצר.

4.1. שם כיתה מותאם אישית

ניתן להגדיר את שם מחלקת המפעל שנוצרה className:

@AutoFactory (className = "SamsungFactory") SmartPhone בכיתה ציבורית {// ...}

עם התצורה לעיל, ניצור מחלקה בשם SamsungFactory:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") מחלקת גמר ציבורית SamsungFactory {// ...}

4.2. לא סופי בתי חרושת

שים לב שמחלקת המפעל שנוצרה מסומנת כברירת מחדל כסופית, כך שנוכל לשנות התנהגות זו על ידי הגדרת ה- allowSubclasses מייחס ל שֶׁקֶר:

@AutoFactory (className = "SamsungFactory", allowSubclasses = true) SmartPhone בכיתה ציבורית {// ...}

עכשיו יש לנו:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") מחלקה ציבורית SamsungFactory {// ...}

4.3. יכולות נוספות

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

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

ממשק ציבורי CustomStorage {SmartPhone customROMInGB (int romSize); }

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

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

@AutoFactory (className = "SamsungFactory", allowSubclasses = true, implement = CustomStorage.class) SmartPhone בכיתה ציבורית {SmartPhone ציבורית (int romSize) {// ...} // ...}

לכן, מפעל אוטומטי יפיק את הקוד הבא:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") מחלקה ציבורית SamsungFactory מיישמת את CustomStorage {// ... SmartPhone ציבורית ליצור (int romSize) {להחזיר SmartPhone חדש (romSize); } @ Override ציבורי סמארטפון ציבורי customROMInGB (int romSize) {return create (romSize); }}

4.4. מפעלים עם הרחבות

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

שיעור מופשט ציבורי AbstractFactory {תקציר CustomPhone newInstance (מותג מיתרים); } @ AutoFactory (הרחבה = AbstractFactory.class) מחלקה ציבורית CustomPhone {מותג מחרוזת סופי פרטי; CustomPhone ציבורי (מותג מחרוזות) {this.brand = brand; }}

הנה, הארכנו את תקציר מפעל בשיעור באמצעות מַאֲרִיך. כמו כן, עלינו לעשות זאת שימו לב כי כל שיטה מופשטת בכיתת המופשט הבסיסית (תקציר מפעל) צריך שיהיה קונסטרוקטור מתאים בכיתת הבטון (CustomPhone).

לבסוף נוכל לראות את הקוד שנוצר הבא:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") ציבורי סופי ציבורי CustomPhoneFactory מרחיב AbstractFactory {@ הזרקת CustomPhoneFactory ציבורי () {} ציבורי CustomPhone ציבורי (מותג מחרוזת) {החזר CustomPhone חדש (checkNotNull (מותג, 1) ); } @Override CustomPhone ציבורי newInstance (מותג מחרוזת) {return create (brand); } // ...}

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

5. מפעל אוטומטי עם רעיון

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

ראשית, בואו נוסיף רעיון אל ה pom.xml:

 com.google.inject guice 4.2.0 

הגרסה האחרונה של רעיון ניתן למצוא כאן.

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

מכיוון שאנו מצפים ש- "Sony" תהיה ספקית המצלמה, עלינו להזרים ספקית SonyCamera ל PhoneFactoryבונה:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") מחלקת הגמר הציבורית PhoneFactory {פרטית הסופית הסופית cameraProvider; @ הזרקת PhoneFactory ציבורי (@Named ("Sony") ספקית cameraProvider) {this.cameraProvider = checkNotNull (cameraProvider, 1); } // ...}

לבסוף, נכין את הכריכה ב- a רעיון מודול:

מחלקה ציבורית SonyCameraModule מרחיב את AbstractModule {intic static int SONY_CAMERA_SERIAL = 1; @Named ("Sony") @Provides Camera cameraProvider () {להחזיר מצלמה חדשה ("Sony", String.format ("% 03d", SONY_CAMERA_SERIAL ++)); }}

והגדרנו את ספק המצלמות שהועלה עליו הערות @Named ("סוני") ב SonyCameraModule להתאים PhoneFactoryפרמטר קונסטרוקטור.

עכשיו נוכל לראות זאת רעיון מנהל הזרקת תלות למפעל שנוצר:

מזרק מזרק = Guice.createInjector (SonyCameraModule חדש ()); PhoneFactory injectedFactory = injector.getInstance (PhoneFactory.class); טלפון xperia = injectedFactory.create ("Xperia");

6. מתחת למכסה המנוע

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

7. מסקנה

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

כמו תמיד, ניתן למצוא את היישום המלא של דוגמאות הקוד ב- Github.


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