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.