Marker sučelja u Javi

1. Uvod

U ovom brzom vodiču naučit ćemo o sučeljima markera u Javi.

2. Sučelja markera

Označno sučelje je sučelje koje u sebi nema metoda ili konstanti. Pruža informacije o tipu vremena izvođenja o objektima, tako da kompajler i JVM imaju dodatne informacije o objektu.

Sučelje markera naziva se i označno sučelje.

Iako se sučelja markera još uvijek koriste, vrlo vjerojatno upućuju na miris koda i treba ih pažljivo koristiti. Glavni razlog tome je što zamućuju crte o tome što sučelje predstavlja jer oznake ne definiraju nikakvo ponašanje. Noviji razvoj favorizira bilješke kako bi riješio neke od istih problema.

3. JDK Marker sučelja

Java ima mnoštvo ugrađenih sučelja za označivanje, poput Serijalizirati, Klonirajući, i Daljinski.

Uzmimo primjer Klonirajući sučelje. Ako pokušamo klonirati objekt koji ne implementira ovo sučelje, JVM baca a CloneNotSupportedException. Dakle, Klonirajućisučelje markera pokazatelj je JVM-a koje možemo nazvati Object.clone () metoda.

Na isti način, kada zovete ObjectOutputStream.writeObject () metoda, JVM provjerava implementira li objekt Serijalizirati sučelje markera. Kad nije tako, a NotSerializableException baca se. Prema tome, objekt nije serializiran u izlazni tok.

4. Prilagođeno sučelje markera

Stvorimo vlastito sučelje markera.

Na primjer, mogli bismo stvoriti marker koji pokazuje može li se objekt ukloniti iz baze podataka:

javno sučelje Izbrisivo {}

Da bi se entitet izbrisao iz baze podataka, objekt koji predstavlja taj entitet mora implementirati naš Može se izbrisati sučelje markera:

javna klasa Entity implementira Deletable {// Implementation Details}

Recimo da imamo DAO objekt s metodom za uklanjanje entiteta iz baze podataka. Možemo napisati svoje izbrisati() metoda tako da samo objekti koji implementiraju naše sučelje markera može se izbrisati:

javna klasa ShapeDao {// ostale metode dao javno logičko brisanje (objektni objekt) {if (! (objekt instanceof Deletable)) {return false; } // brisanje detalja o implementaciji return true; }}

Kao što vidimo, dajemo naznake JVM-u o ponašanju naših objekata u vrijeme izvođenja. Ako objekt implementira naše sučelje markera, može se izbrisati iz baze podataka.

5. Sučelja markera nasuprot bilješkama

Uvođenjem bilješki Java nam je pružila alternativu za postizanje istih rezultata kao sučelja markera. Štoviše, poput sučelja markera, možemo primijeniti bilješke na bilo koju klasu i možemo ih koristiti kao pokazatelje za izvođenje određenih radnji.

Pa, koja je ključna razlika?

Za razliku od napomena, sučelja nam to omogućavaju iskoristite polimorfizam. Kao rezultat toga možemo dodajte dodatna ograničenja na sučelje markera.

Na primjer, dodajmo ograničenje koje samo a Oblik vrsta može se ukloniti iz baze podataka:

javno sučelje Oblik {double getArea (); dvostruki getCircumference (); }

U ovom slučaju, nazovimo ga naše sučelje markera DeletableShape, izgledat će sljedeće:

javno sučelje DeletableShape proširuje oblik {}

Tada će naša klasa implementirati sučelje markera:

javna klasa Rectangle implementira DeletableShape {// detalji implementacije}

Stoga, svi DeletableShape implementacije su također Oblik implementacije. Očito, ne možemo to učiniti pomoću bilješki.

Međutim, svaka odluka o dizajnu ima kompromise i polimorfizam se može koristiti kao protuargument protiv sučelja markera. U našem primjeru, svaki razred koji se proteže Pravokutnik automatski će se implementirati DeletableShape.

6. Marker sučelja naspram tipičnih sučelja

U prethodnom primjeru mogli bismo dobiti iste rezultate mijenjanjem naših DAO-a izbrisati() metoda za ispitivanje je li naš objekt a Oblik ili ne, umjesto da testira je li to Može se izbrisati:

javna klasa ShapeDao {// ostale metode dao javno logičko brisanje (objektni objekt) {if (! (objekt instance of Shape)) {return false; } // brisanje detalja o implementaciji return true; }}

Pa zašto onda stvarati sučelje markera kad možemo postići iste rezultate pomoću tipičnog sučelja?

Zamislimo to, pored Oblik tipa, želimo ukloniti Osoba tip iz baze podataka. U ovom slučaju postoje dvije mogućnosti da se to postigne:

Prva opcija je kako bismo dodali dodatnu provjeru našoj prethodnoj izbrisati() metoda da provjeri je li objekt za brisanje primjerak Osoba ili ne.

javno logičko brisanje (objektni objekt) {if (! (objekt instanceof Shape || objekt instance osobe)) {return false; } // brisanje detalja o implementaciji return true; }

Ali što ako imamo više vrsta koje želimo ukloniti i iz baze podataka? Očito, ovo neće biti dobra opcija jer jesmo da promijenimo našu metodu za svaki novi tip.

Druga opcija je napravitithe Osoba tip provesti Oblik sučelje, koji djeluje kao sučelje markera. Ali je li Osoba objekt stvarno a Oblik? Odgovor je očito ne, a to drugu opciju čini gorom od prve.

Stoga, premda možemo postići iste rezultate korištenjem tipičnog sučelja kao markera, na kraju ćemo imati loš dizajn.

7. Zaključak

U ovom smo članku razgovarali o tome što su sučelja s markerima i kako se mogu koristiti. Zatim smo pogledali neke ugrađene Java primjere ove vrste sučelja i kako ih koristi JDK.

Zatim smo stvorili vlastito sučelje markera i odmjerili ga pomoću bilješke. Konačno, na kraju ćemo vidjeti zašto je dobra praksa koristiti sučelje markera u nekim scenarijima umjesto tradicionalnog sučelja.

Kao i uvijek, kod se može naći na GitHubu.