Az AutoFactory bemutatása

1. Bemutatkozás

Ebben az oktatóanyagban röviden bemutatjuk AutoFactory, a Google-tól.

Ez egy forrásszintű kódgenerátor, amely segít a gyárak létrehozásában.

2. Maven Setup

Mielőtt elkezdenénk, adjuk hozzá a következő függőséget a pom.xml:

 com.google.auto.factory auto-factory 1.0-beta5 

A legújabb verzió itt található.

3. Gyorsindítás

Nézzük most meg gyorsan AutoFactory képes és létrehozhat egy egyszerűt Telefon osztály.

Tehát, amikor feljegyezzük a Telefon osztályban @AutoFactory és konstruktora paramétere @Biztosítani, kapunk:

@AutoFactory nyilvános osztály Telefon {private final Camera camera; privát végleges String egyéb alkatrészek; PhoneAssembler (@Provided Camera camera, String otherParts) {this.camera = camera; this.otherParts = otherParts; } // ...}

Csak két annotációt használtunk: @AutoFactory és @Biztosítani. Ha szükségünk van az osztályunk számára létrehozott gyárra, akkor ezt feljegyezhetjük @AutoFactory, mivel @Biztosítani vonatkozik ennek az osztálynak a konstruktorparamétereire, és ez azt jelenti, hogy az annotált paramétert injektálva kell megadni Szolgáltató.

A fenti részletben arra számítunk, hogy Kamera bármely fényképezőgép gyártója és AutoFactory segít a következő kód előállításában:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") public final class PhoneFactory {private final Provider cameraProvider; @Inject PhoneAssemblerFactory (Szolgáltató cameraProvider) {this.cameraProvider = checkNotNull (cameraProvider, 1); } PhoneAssembler create (String otherParts) {return new PhoneAssembler (checkNotNull (cameraProvider.get (), 1), checkNotNull (otherParts, 2)); } // ...}

Most van egy PhoneFactory által generált automatikusan AutoFactory fordítási időben, és telefonos példányok előállítására használhatjuk:

PhoneFactory phoneFactory = new PhoneFactory (() -> new Camera ("Ismeretlen", "XXX")); Phone simplePhone = phoneFactory.create ("egyéb alkatrészek");

A @AutoFactory a kommentár alkalmazható a kivitelezőkre is:

nyilvános osztályú ClassicPhone {privát végleges karakterlánc-kezelő; privát végső vonós csengő; privát String egyéb alkatrészek; @AutoFactory public ClassicPhone (@Provided String dialpad, @Provided String ringer) {this.dialpad = dialpad; ez.csengő = csengő; } @AutoFactory public ClassicPhone (String otherParts) {this ("defaultDialPad", "defaultRinger"); this.otherParts = otherParts; } // ...}

A fenti részletben jelentkeztünk @AutoFactory mindkét kivitelezőnek. AutoFactory egyszerűen két létrehozási módot generál nekünk ennek megfelelően:

@Generated (value = "com.google.auto.factory.processor.AutoFactoryProcessor") public final class ClassicPhoneFactory {private final Provider java_lang_StringProvider; @ Inject public ClassicPhoneFactory (Provider java_lang_StringProvider) {this.java_lang_StringProvider = checkNotNull (java_lang_StringProvider, 1); } public ClassicPhone create () {return new ClassicPhone (checkNotNull (java_lang_StringProvider.get (), 1), checkNotNull (java_lang_StringProvider.get (), 2)); } public ClassicPhone create (String otherParts) {adja vissza az új ClassicPhone-t (checkNotNull (otherParts, 1)); } // ...}

AutoFactory szintén támogatja a paraméterrel kommentált paramétereket @Biztosítani, de csak a JSR-330 annotációkhoz.

Például, ha azt akarjuk, hogy cameraProvider hogy „Sony” legyünk, megváltoztathatjuk a Telefon osztály:

@AutoFactory public class Phone {PhoneAssembler (@Provided @Named ("Sony") Camera camera, String otherParts) {this.camera = camera; this.otherParts = otherParts; } // ...}

Az AutoFactory megőrzi a @Nevezett@ Minősítő hogy felhasználhassuk például a Dependency Injection keretrendszerek használatakor:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") public final class PhoneFactory {private final Provider cameraProvider; @Inject PhoneAssemblerFactory (@Names ("Sony") Szolgáltató cameraProvider) {this.cameraProvider = checkNotNull (cameraProvider, 1); } // ...}

4. Testreszabott kódgenerálás

Számos attribútumot használhatunk a @AutoFactory megjegyzés a létrehozott kód testreszabásához.

4.1. Egyéni osztály neve

A létrehozott gyári osztály neve a gombbal állítható be osztály név:

@AutoFactory (className = "SamsungFactory") nyilvános osztályú SmartPhone {// ...}

A fenti konfigurációval létrehozunk egy nevű osztályt SamsungFactory:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") public final class SamsungFactory {// ...}

4.2. nem végleges Gyárak

Ne feledje, hogy a létrehozott gyári osztály alapértelmezés szerint véglegesnek van jelölve, így ezt a viselkedést a allowSubclasses tulajdonít neki hamis:

@AutoFactory (className = "SamsungFactory", allowSubclasses = true) nyilvános osztályú SmartPhone {// ...}

Most van:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") nyilvános osztály SamsungFactory {// ...}

4.3. További képességek

Ezenkívül meghatározhatjuk a létrehozott gyár által megvalósítandó interfészek listáját a „végrehajtása ”paraméter.

Itt kell a SamsungFactory testreszabható tárhelyű okostelefonok gyártásához:

nyilvános felület CustomStorage {SmartPhone customROMInGB (int romSize); }

Vegye figyelembe, hogy az interfész metódusainak vissza kell adniuk az alaposztály példányait SmartPhone.

Ezután egy gyári osztály előállításához a fenti interfésszel, AutoFactory az alaposztály megfelelő kivitelezőit igényli:

@AutoFactory (className = "SamsungFactory", allowSubclasses = true, implementálás = CustomStorage.class) nyilvános osztályú SmartPhone {public SmartPhone (int romSize) {// ...} // ...}

Így, AutoFactory a következő kódot generálja:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") nyilvános osztály A SamsungFactory megvalósítja a CustomStorage {// ... nyilvános SmartPhone create (int romSize) {return new SmartPhone (romSize); } @Orride public SmartPhone customROMInGB (int romSize) {return create (romSize); }}

4.4. Gyárak bővítéssel

Mivel AutoFactory interfészmegvalósításokat generálhat, természetes elvárni, hogy képes legyen osztályok kibővítésére is, és ez valóban lehetséges:

public abstract class AbstractFactory {abstract CustomPhone newInstance (String márka); } @AutoFactory (kiterjesztve = AbstractFactory.class) nyilvános osztály CustomPhone {private final String márka; public CustomPhone (String márka) {this.brand = brand; }}

Itt meghosszabbítottuk a AbstractFactory osztály felhasználásával kiterjedő. Azt is meg kellene tennünk vegye figyelembe, hogy az absztrakt alaposztály (AbstractFactory) megfelelő konstruktorral kell rendelkeznie a beton osztályban (CustomPhone).

Végül láthatjuk a következő generált kódot:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") public final class CustomPhoneFactory extends AbstractFactory {@Inject public CustomPhoneFactory () {} public CustomPhone create (String brand) {return new CustomPhone (checkNotNull (brand, 1) ); } @Orride public CustomPhone newInstance (String brand) {return create (brand); } // ...}

Ezt láthatjuk AutoFactory elég okos ahhoz, hogy a konstruktort felhasználja a megfelelő absztrakt módszer megvalósításához - ehhez hasonló nagyszerű szolgáltatások AutoFactory biztosan sok időt és kódot fog megspórolni nekünk.

5. AutoFactory Val vel Guice

Amint azt a cikkben korábban említettük, AutoFactory támogatja a JSR-330 annotációkat, így integrálhatjuk vele a meglévő függőség-injektálási keretrendszert.

Először tegyük hozzá Guice hoz pom.xml:

 com.google.inject guice 4.2.0 

A legfrissebb verziója Guice itt található.

Most be fogjuk mutatni, hogy milyen jól AutoFactory integrálódik Guice.

Mivel azt várjuk, hogy a „Sony” lesz a kamera szolgáltató, be kell adnunk a SonyCameraProvider nak nek PhoneFactoryKivitelezője:

@Generated ("com.google.auto.factory.processor.AutoFactoryProcessor") public final class PhoneFactory {private final Provider cameraProvider; @ Inject public PhoneFactory (@Named ("Sony") Provider cameraProvider) {this.cameraProvider = checkNotNull (cameraProvider, 1); } // ...}

Végül elkészítjük a kötést a Guice modul:

nyilvános osztály A SonyCameraModule kiterjeszti az AbstractModule {private static int SONY_CAMERA_SERIAL = 1; @Név ("Sony") @Provides Camera cameraProvider () {return new Camera ("Sony", String.format ("% 03d", SONY_CAMERA_SERIAL ++)); }}

És beállítottuk a fényképezőgép-szolgáltató jegyzetét @Név („Sony”) ban ben SonyCameraModule illeszkedik PhoneFactoryKonstruktor paramétere.

Most ezt láthatjuk Guice a generált gyárunk függőség-injektálását kezeli:

Injektorinjektor = Guice.createInjector (új SonyCameraModule ()); PhoneFactory injectedFactory = injector.getInstance (PhoneFactory.class); Telefon xperia = injectedFactory.create ("Xperia");

6. A motorháztető alatt

Minden feljegyzés a AutoFactory az összeállítás szakaszában kerülnek feldolgozásra, amint azt a cikkben részletesen kifejtettük: hogyan működik a forrásszintű feljegyzések feldolgozása.

7. Következtetés

Ebben a cikkben bemutattuk az AutoFactory használatát és az integrálását Guice - az írógyárak ismétlődhetnek és hajlamosak lehetnek - a kódgeneráló eszközök, mint például AutoFactory és AutoValue sok időt spórolhat meg nekünk és megszabadíthat minket a finom hibáktól.

Mint mindig, a kódminták teljes megvalósítása megtalálható a Github oldalon.