Marker interfészek Java-ban
1. Bemutatkozás
Ebben a gyors oktatóanyagban megismerkedhetünk a Java jelölőfelületeivel.
2. Marker interfészek
A marker interfész olyan felület, amely nincsenek benne módszerei vagy állandói. Ez biztosítja futásidejű információk az objektumokról, tehát a fordító és a JVM további információk az objektumról.
A jelölőfelületet címkéző felületnek is nevezik.
Bár a jelölőfelületek még mindig használatosak, nagy valószínűséggel kódszagra mutatnak, és körültekintően kell használni őket. Ennek fő oka az, hogy elhomályosítják a vonalakat arról, hogy mit jelent az interfész, mivel a markerek nem határoznak meg semmilyen viselkedést. Az újabb fejlesztések előnyben részesítik az annotációkat ugyanazok a problémák megoldására.
3. JDK Marker interfészek
A Java sok beépített marker interfésszel rendelkezik, mint pl Sorosítható, Klónozható, és Távoli.
Vegyük a Klónozható felület. Ha megpróbálunk olyan objektumot klónozni, amely nem valósítja meg ezt az interfészt, akkor a JVM dob egy CloneNotSupportedException. Ezért a KlónozhatóA marker interfész a JVM mutatója hogy hívhatjuk a Object.clone () módszer.
Ugyanígy, amikor a ObjectOutputStream.writeObject () módszer, a JVM ellenőrzi, hogy az objektum végrehajtja-e a Sorosítható marker interfész. Ha nem erről van szó, a NotSerializableException dobják. Ezért az objektum nincs sorosítva a kimeneti adatfolyamhoz.
4. Custom Marker Interface
Készítsük el a saját marker felületünket.
Például létrehozhatunk egy jelölőt, amely jelzi, hogy egy objektum eltávolítható-e az adatbázisból:
nyilvános felület törölhető {}
Az entitás törléséhez az adatbázisból az entitást képviselő objektumnak végre kell hajtania a mi Törölhető jelölőfelület:
public class Entity végrehajtja Törölhető {// megvalósítás részletei}
Tegyük fel, hogy van egy DAO objektumunk, amelynek metódusa van az entitások eltávolítására az adatbázisból. Írhatjuk a mi töröl() módszer úgy csak a marker felületünket megvalósító objektumok törölhető:
public class ShapeDao {// egyéb dao metódusok nyilvános logikai törlés (Object object) {if (! (törölhető objektum példánya)) {return false; } // a megvalósítás részleteinek törlése return true; }}
Ahogy látjuk, jelzést adunk a JVM-nek tárgyaink futási viselkedéséről. Ha az objektum megvalósítja a marker felületünket, akkor törölhető az adatbázisból.
5. Marker interfészek és kommentárok
A kommentárok bevezetésével a Java alternatívát biztosított számunkra, hogy ugyanazokat az eredményeket érjük el, mint a marker interfészek. Sőt, hasonlóan a jelölőfelületekhez, minden osztályra alkalmazhatunk kommentárokat, és indikátorokként használhatjuk őket bizonyos műveletek végrehajtására.
Tehát mi a legfontosabb különbség?
A jelölésekkel ellentétben az interfészek lehetővé teszik számunkra használja ki a polimorfizmus előnyeit. Ennek eredményeként megtehetjük adjon hozzá további korlátozásokat a marker felülethez.
Vegyünk például egy korlátozást, amely csak a Alak típus eltávolítható az adatbázisból:
nyilvános felület Alakzat {double getArea (); kettős getCircumference (); }
Ebben az esetben a marker felületünket, nevezzük DeletableShape, a következőképpen fog kinézni:
nyilvános felület A DeletableShape kiterjeszti az alakzatot {}
Ezután osztályunk megvalósítja a marker felületet:
public class Rectangle implementálja a DeletableShape {// implementáció részletei}
Ebből kifolyólag, minden DeletableShape megvalósítások is Alak megvalósítások. Nyilvánvalóan, ezt nem tehetjük meg annotációkkal.
Azonban minden tervezési döntésnek kompromisszumai vannak és a polimorfizmus használható ellenérvként a jelölőfelületek ellen. Példánkban minden osztály meghosszabbodik Téglalap automatikusan végrehajtja DeletableShape.
6. Marker interfészek vs. tipikus interfészek
Az előző példában ugyanazokat az eredményeket kaphattuk a DAO-k módosításával töröl() módszer annak tesztelésére, hogy objektumunk a Alak vagy nem, ahelyett, hogy tesztelné, hogy ez a Törölhető:
public class ShapeDao {// egyéb dao metódusok nyilvános logikai törlés (Object object) {if (! (Shape objektum példánya)) {return false; } // a megvalósítás részleteinek törlése return true; }}
Miért kell akkor létrehozni egy marker felületet, amikor ugyanazokat az eredményeket érhetjük el egy tipikus felület használatával?
Képzeljük el, hogy a Alak típusú, el akarjuk távolítani a Személy írja be az adatbázisból is. Ebben az esetben két lehetőség van ennek elérésére:
Az első lehetőség az hogy további ellenőrzést adjunk az előzőhöz töröl() módszer annak ellenőrzése, hogy a törölni kívánt objektum példánya-e Személy vagy nem.
nyilvános logikai törlés (Object object) {if (! (Shape objektum példánya || Személy objektum példánya)) {return false; } // a megvalósítás részleteinek törlése return true; }
De mi van, ha több típusunk van, amelyeket el akarunk távolítani az adatbázisból is? Nyilvánvaló, hogy ez nem lesz jó lehetőség, mert megvolt hogy minden új típushoz megváltoztassuk módszerünket.
A második lehetőség az csinálnia Személy típusú munkagép a Alak felület, amely marker interfészként működik. De a Személy tárgy valóban a Alak? A válasz egyértelműen nem, és ez a második lehetőséget rosszabbá teszi, mint az elsőt.
Ezért bár ugyanazokat az eredményeket érhetjük el, ha egy tipikus interfészt használunk jelölőként, gyenge tervezéssel fogunk végezni.
7. Következtetés
Ebben a cikkben megvitattuk, hogy melyek a marker interfészek, és hogyan használhatók. Ezután megnéztünk néhány beépített Java példát az ilyen típusú interfészekre és arra, hogy a JDK hogyan használja őket.
Ezután létrehoztuk a saját marker felületünket, és összehasonlítottuk egy kommentár használatával. Végül megtudhatjuk, miért jó gyakorlat néhány esetben a marker felületet használni a hagyományos felület helyett.
Mint mindig, a kód megtalálható a GitHubon is.