Značkovacie rozhrania v Jave

1. Úvod

V tomto rýchlom výučbe sa dozvieme o značkovacích rozhraniach v Jave.

2. Rozhrania značiek

Rozhranie značkovača je rozhranie, ktoré nemá v sebe žiadne metódy ani konštanty. To poskytuje run-time informácie o objektoch, takže kompilátor a JVM majú ďalšie informácie o objekte.

Rozhranie značkovača sa tiež nazýva rozhranie značkovania.

Aj keď sa značkovacie rozhrania stále používajú, veľmi pravdepodobne poukazujú na vôňu kódu a mali by sa používať opatrne. Hlavným dôvodom je to, že stierajú čiary okolo toho, čo predstavuje rozhranie, pretože značky nedefinujú žiadne správanie. Nový vývoj uprednostňuje poznámky k riešeniu rovnakých problémov.

3. Rozhrania značiek JDK

Java má veľa zabudovaných značkovacích rozhraní, ako napr Serializovateľné, Cloneablea Diaľkové.

Zoberme si príklad z Cloneable rozhranie. Ak sa pokúsime naklonovať objekt, ktorý toto rozhranie neimplementuje, vrhne JVM a CloneNotSupportedException. Preto je Cloneablemarker interface je indikátorom pre JVM že môžeme nazvať Object.clone () metóda.

Rovnakým spôsobom, keď voláte ObjectOutputStream.writeObject () metóda, JVM skontroluje, či objekt implementuje Serializovateľné značkovacie rozhranie. Ak to tak nie je, a NotSerializableException je hodená. Objekt preto nie je serializovaný do výstupného toku.

4. Rozhranie vlastných značiek

Vytvorme si svoje vlastné rozhranie značiek.

Mohli by sme napríklad vytvoriť značku, ktorá označuje, či je možné objekt odstrániť z databázy:

verejné rozhranie odstrániteľné {}

Aby bolo možné vymazať entitu z databázy, musí objekt predstavujúci túto entitu implementovať našu Vymazateľné značkovacie rozhranie:

entita verejnej triedy implementuje odstrániteľné {// podrobnosti implementácie}

Povedzme, že máme objekt DAO s metódou odstraňovania entít z databázy. Môžeme napísať svoje odstrániť () metóda tak, že iba objekty implementujúce naše rozhranie značiek možno vymazať:

public class ShapeDao {// ďalšie dao metódy public boolean delete (Object object) {if (! (object instanceof Deletable)) {return false; } // vymazať podrobnosti implementácie return true; }}

Ako vidíme, dávame údaj JVM o chovaní našich objektov za behu. Ak objekt implementuje naše značkovacie rozhranie, môže byť vymazaný z databázy.

5. Rozhrania značiek vs. anotácie

Zavedením anotácií nám Java poskytla alternatívu na dosiahnutie rovnakých výsledkov ako značkovacie rozhrania. Okrem toho, podobne ako rozhrania značiek, môžeme aplikovať anotácie na ľubovoľnú triedu a môžeme ich použiť ako indikátory na vykonávanie určitých akcií.

Aký je teda kľúčový rozdiel?

Na rozdiel od anotácií nám to rozhranie umožňuje využiť výhody polymorfizmu. Vďaka tomu môžeme pridať ďalšie obmedzenia do rozhrania značky.

Napríklad pridajme obmedzenie, že iba a Tvar typ je možné z databázy odstrániť:

verejné rozhranie Tvar {double getArea (); double getCircumference (); }

V tomto prípade naše značkovacie rozhranie, nazvime to DeletableShape, bude vyzerať takto:

verejné rozhranie DeletableShape rozširuje tvar {}

Potom bude naša trieda implementovať rozhranie značiek:

verejná trieda Obdĺžnik implementuje DeletableShape {// podrobnosti implementácie}

Preto všetko DeletableShape implementácie sú tiež Tvar implementácie. Je zrejmé, že to nemôžeme urobiť pomocou anotácií.

Každé rozhodnutie o dizajne má však kompromisy a polymorfizmus možno použiť ako protiargument proti značkovým rozhraniam. V našom príklade sa každá trieda rozširuje Obdĺžnik sa automaticky implementuje DeletableShape.

6. Rozhrania značiek oproti typickým rozhraniam

V predchádzajúcom príklade sme mohli dosiahnuť rovnaké výsledky úpravou našich DAO odstrániť () metóda na otestovanie, či je náš objekt a Tvar alebo nie, namiesto testovania, či je to Odstrániteľné:

public class ShapeDao {// ďalšie dao metódy public boolean delete (Object object) {if (! (object instanceof Shape)) {return false; } // vymazať podrobnosti implementácie return true; }}

Prečo teda vytvárať značkovacie rozhranie, keď pomocou typického rozhrania môžeme dosiahnuť rovnaké výsledky?

Poďme si predstaviť, že okrem Tvar typu, chceme odstrániť Osoba napíšte tiež z databázy. V tomto prípade existujú dve možnosti, ako to dosiahnuť:

Prvá možnosť je pridať ďalšiu kontrolu k nášmu predchádzajúcemu odstrániť () metóda na overenie, či je objekt na odstránenie inštanciou Osoba alebo nie.

public boolean delete (Object object) {if (! (object instanceof Shape || object instanceof Person)) {return false; } // vymazať podrobnosti implementácie return true; }

Čo však v prípade, že máme viac typov, ktoré chceme odstrániť aj z databázy? Je zrejmé, že to nebude dobrá voľba, pretože máme zmeniť našu metódu pre každý nový typ.

Druhá možnosť je urobiťthe Osoba typ implementovať Tvar rozhranie, ktorá funguje ako značkovacie rozhranie. Ale je Osoba objekt naozaj a Tvar? Odpoveď je jednoznačne nie, a tým je druhá možnosť horšia ako prvá.

Preto, aj keď rovnaké výsledky môžeme dosiahnuť použitím typického rozhrania ako značky, nakoniec skončíme so zlým dizajnom.

7. Záver

V tomto článku sme diskutovali o tom, čo sú značkovacie rozhrania a ako sa dajú použiť. Potom sme sa pozreli na niektoré vstavané príklady jazyka Java tohto typu rozhraní a na to, ako ich používa JDK.

Ďalej sme vytvorili vlastné rozhranie značiek a zvážili ho pomocou anotácie. Nakoniec skončíme tým, že uvidíme, prečo je dobrým zvykom používať v niektorých scenároch namiesto tradičného rozhrania značkovacie rozhranie.

Ako vždy, kód nájdete na GitHub.


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