Java instanca operatora

1. Uvod

U ovom brzom vodiču naučit ćemo o instanceof operater u Javi.

2. Što je instanceof Operater?

instanceof je binarni operator koji se koristi za ispitivanje je li objekt određenog tipa. Rezultat operacije je bilo pravi ili lažno. Poznat je i kao operator usporedbe tipova jer uspoređuje instancu s tipom.

Prije lijevanja nepoznatog predmeta, instanceof provjeru uvijek treba koristiti. To pomaže u izbjegavanju ClassCastException za vrijeme izvođenja.

The instanceof Osnovna sintaksa operatora je:

(objekt) instanceof (vrsta)

Pogledajmo osnovni primjer za instanceof operater. Prvo, izradimo razred Krug:

javni razred {/ // detalji implementacije}

Dalje, kreirajmo razred Prsten to se proteže Krug:

javni razred Prsten se proteže u krug {// detalji provedbe}

Možemo koristiti instanceof kako bi provjerio je li instanca Prsten je od Krug tip:

@Test javna praznina givenWhenInstanceIsCorrect_thenReturnTrue () {Ring ring = new Ring (); Assert.assertTrue (prsten instance Round); }

3. Kako se instanceof Posao operatora?

The instanceof operator radi na principu odnosa is-a. Koncept odnosa odnosa zasnovan je na nasljeđivanju klase ili implementaciji sučelja.

Da bismo to demonstrirali, stvorimo a Oblik sučelje:

oblik javnog sučelja {// detalji provedbe}

Stvorimo i razred Krug koja provodi Oblik sučelje i također proširuje Krug razred:

public class Circle proširuje okrugli oblik oruđa {// implementacija detalji}

The instanceof rezultat će biti pravi ako je objekt primjer tipa:

@Test javna praznina givenWhenObjectIsInstanceOfType_thenReturnTrue () {Krug kruga = novi krug (); Assert.assertTrue (kružnica instance Circle); }

Bit će i to pravi ako je objekt primjerak podklase tipa:

@Test javna praznina giveWhenInstanceIsOfSubtype_thenReturnTrue () {Krug kruga = novi krug (); Assert.assertTrue (kružnica instance Round); }

Ako je vrsta sučelje, vratit će se pravi ako objekt implementira sučelje:

@Test javna praznina givenWhenTypeIsInterface_thenReturnTrue () {Krug kruga = novi krug (); Assert.assertTrue (kružnica instance Shape); }

Primjer Operator se ne može koristiti ako ne postoji veza između predmeta koji se uspoređuje i vrste s kojom se uspoređuje.

Stvorimo novu klasu Trokut koji provodi Oblik ali nema veze s Krug:

trokut javne klase implementira oblik {// detalji provedbe}

Sad, ako koristimo instanceof da provjeri je li Krug je instanca Trokut:

@Test javna praznina givenWhenComparingClassInDiffHierarchy_thenCompilationError () {Krug kruga = novi krug (); Assert.assertFalse (kružnica instance Trokuta); }

Dobit ćemo pogrešku u kompilaciji jer ne postoji veza između Krug i Trokut klase:

java.lang.Error: Neriješen problem kompilacije: Nekompatibilni uvjetni tipovi operanda Krug i trokut

4. Korištenje instanceof s Objekt Tip

U Javi svaka klasa implicitno nasljeđuje od Objekt razred. Stoga, koristeći instanceof operater s Objekt tip će uvijek procijeniti na pravi:

@Test javna praznina givenWhenTypeIsOfObjectType_thenReturnTrue () {Tema niti = nova nit (); Assert.assertTrue (instanca predmeta objekta); }

5. Korištenje instanceof Operator kada je objekt null

Ako koristimo instanceof operator na bilo kojem objektu koji je null, vraća se lažno. Također, nije potrebna provjera nule kada koristite instanceof operater.

@Test javna praznina givenWhenInstanceValueIsNull_thenReturnFalse () {Krug kruga = null; Assert.assertFalse (kružnica instance Round); }

6. instanceof i generike

Instancijski testovi i odljevci ovise o provjeri informacija o tipu tijekom izvođenja. Stoga ne možemo koristiti instanceof zajedno sa izbrisanim generičkim tipovima.

Na primjer, ako pokušamo sastaviti sljedeći isječak:

javna statička void sortiranje (zbirka popisa) {if (zbirka instance of List) {// sortiranje nizova drugačije} // izostavljeno}

Tada dobivamo ovu pogrešku pri kompilaciji:

pogreška: ilegalni generički tip for instanceof if (zbirka instanceof List) {^

Tehnički gledano, smijemo samo koristiti instanceof zajedno s reificiranimvrste u Javi. Tip se reificira ako su podaci o njegovom tipu prisutni tijekom izvođenja.

Ponovno utvrđeni tipovi u Javi su sljedeći:

  • Primitivni tipovi poput int
  • Negeneričke klase i sučelja poput Niz ili Slučajno
  • Generički tipovi kod kojih su sve vrste neograničeni zamjenski znakovi poput Postavi ili Karta
  • Sirove vrste poput Popis ili HashMap
  • Nizovi drugih vrsta koje se mogu popraviti, poput Niz [], popis [], ili Karta[]

Budući da parametri generičkog tipa nisu reificirani, ne možemo ih ni koristiti:

javna statička logička vrijednost isOfType (Object input) {return input instanceof T; // neće se kompajlirati}

Međutim, moguće je testirati nešto slično Popis:

if (collection instanceof List) {// učiniti nešto}

7. Zaključak

U ovom uputstvu naučili smo o instanceof operatora i kako ga koristiti. Cjeloviti uzorci koda dostupni su na GitHubu.