Prevádzkovateľ inštancie Java

1. Úvod

V tomto rýchlom výučbe sa dozvieme viac o inštancia operátor v Jave.

2. Čo je to inštancia Operátor?

inštancia je binárny operátor používaný na testovanie, či je objekt daného typu. Výsledok operácie je buď pravda alebo nepravdivé. Je tiež známy ako operátor porovnania typov, pretože porovnáva inštanciu s typom.

Pred vrhnutím neznámeho predmetu inštancia kontrola by sa mala vždy použiť. To pomáha vyhnúť sa ClassCastException za behu.

The inštancia základná syntax operátora je:

(object) instanceof (type)

Pozrime sa na základný príklad pre inštancia operátor. Najskôr vytvorme triedu Okrúhly:

kolo verejnej triedy {// podrobnosti implementácie}

Ďalej vytvoríme triedu Prsteň ktorý sa rozširuje Okrúhly:

kruh verejnej triedy rozširuje kolo {// podrobnosti implementácie}

Môžeme použiť inštancia skontrolovať, či inštancia Prsteň Je z Okrúhly typ:

@Test public void givenWhenInstanceIsCorrect_thenReturnTrue () {Ring ring = new Ring (); Assert.assertTrue (kruhová inštancia kola); }

3. Ako funguje inštancia Práca operátora?

The inštancia operátor pracuje na princípe vzťahu je-vzťah. Koncept vzťahu typu „je-vzťah“ je založený na dedení triedy alebo implementácii rozhrania.

Aby sme to demonštrovali, vytvorme a Tvar rozhranie:

tvar verejného rozhrania {// podrobnosti implementácie}

Vytvorme tiež triedu Kruh ktorý vykonáva Tvar rozhranie a tiež rozširuje Okrúhly trieda:

public class Circle rozširuje Round implementuje Shape {// podrobnosti implementácie}

The inštancia výsledok bude pravda ak je objekt inštanciou typu:

@Test public void givenWhenObjectIsInstanceOfType_thenReturnTrue () {Circle circle = new Circle (); Assert.assertTrue (instance kruhu kruhu); }

Bude tiež pravda ak je objekt inštanciou podtriedy typu:

@Test public void giveWhenInstanceIsOfSubtype_thenReturnTrue () {Circle circle = new Circle (); Assert.assertTrue (kruh instanceof Round); }

Ak je to rozhranie, vráti sa pravda ak objekt implementuje rozhranie:

@Test public void givenWhenTypeIsInterface_thenReturnTrue () {Circle circle = new Circle (); Assert.assertTrue (kruhová inštancia tvaru); }

Inštancia operátor nemožno použiť, ak medzi objektom, ktorý sa porovnáva, a typom, s ktorým sa porovnáva, nie je žiadny vzťah.

Vytvorme novú triedu Trojuholník ktorý realizuje Tvar ale nemá žiadny vzťah s Kruh:

verejná trieda Triangle implementuje Shape {// podrobnosti implementácie}

Teraz, ak použijeme inštancia skontrolovať, či a Kruh je príkladom Trojuholník:

@Test public void givenWhenComparingClassInDiffHierarchy_thenCompilationError () {Circle circle = new Circle (); Assert.assertFalse (kruhová inštancia trojuholníka); }

Dostaneme chybu kompilácie, pretože medzi. Neexistuje žiadny vzťah Kruh a Trojuholník triedy:

java.lang.Error: Nevyriešený problém s kompiláciou: Nekompatibilné typy podmienených operandov Kruh a Trojuholník

4. Používanie inštancia s Objekt Typ

V Jave každá trieda implicitne dedí z Objekt trieda. Preto pomocou inštancia operátor s Objekt typ bude vždy hodnotiť na pravda:

@Test public void givenWhenTypeIsOfObjectType_thenReturnTrue () {vlákno vlákna = nové vlákno (); Assert.assertTrue (vlákno instanceof Object); }

5. Pomocou inštancia Operátor, keď objekt je nulový

Ak použijeme inštancia operátor na akomkoľvek objekte, ktorý je nulový, vracia sa nepravdivé. Tiež nie je potrebná žiadna nulová kontrola pri použití inštancia operátor.

@Test public void givenWhenInstanceValueIsNull_thenReturnFalse () {Circle circle = null; Assert.assertFalse (inštancia kruhu Round); }

6. inštancia a generiká

Testy inštancie a obsadenia závisia od kontroly typových informácií za behu. Preto nemôžeme použiť inštancia spolu s vymazanými generickými typmi.

Napríklad, ak sa pokúsime zostaviť nasledujúci úryvok:

verejné statické void triedenie (kolekcia zoznamov) {if (kolekcia inštancie zoznamu) {// triediť reťazce inak} // vynechané}

Potom dostaneme túto chybu kompilácie:

chyba: neplatný generický typ pre napríklad if (kolekcia inštancie zoznamu) {^

Z technického hľadiska máme povolené iba použitie inštancia spolu s reifiedtypy v Jave. Typ je overený, ak je jeho informácia o type k dispozícii za behu modulu.

Zjednotené typy v prostredí Java sú nasledujúce:

  • Primitívne typy ako int
  • Negenerické triedy a rozhrania ako String alebo Náhodné
  • Všeobecné typy, v ktorých sú všetky typy neobmedzené zástupné znaky Nastaviť alebo Mapa
  • Surové druhy ako Zoznam alebo HashMap
  • Polia iných opakovateľných typov, ako je Reťazec [], zoznam [], alebo Mapa []

Pretože parametre generického typu nie sú zjednotené, nemôžeme ich tiež použiť:

public static boolean isOfType (Object input) {return input instanceof T; // nebude kompilovať}

Je však možné otestovať niečo podobné Zoznam:

if (zbierka inštancie Zoznamu) {// niečo urobte}

7. Záver

V tomto tutoriáli sme sa dozvedeli o inštancia operátor a ako ho používať. Kompletné ukážky kódu sú k dispozícii na GitHub.