Class.isInstance vs Class.isAssignableFrom

1. Uvod

U ovom ćemo brzom vodiču pogledati razliku između Razred.isInstance i Class.isAssnanaFrom. Naučit ćemo kako se koristiti svakom metodom i koje su razlike između njih.

2. Postavljanje

Postavimo sučelje i nekoliko klasa koje ćemo koristiti dok istražujemo Razred.isInstance i Class.isAssnanaFrom funkcionalnost.

Prvo definirajmo sučelje:

oblik javnog sučelja {}

Dalje, definirajmo klasu koja se implementira Oblik:

trokut javne klase implementira oblik {}

Sada ćemo stvoriti klasu koja se proširuje Trokut:

javna klasa IsoscelesTriangle proširuje trokut {}

3. Razred.isInstance

The isInstance metoda na Razred razred je ekvivalentan instanceof operater. The isInstance metoda uvedena je u Javi 1.1 jer se može dinamički koristiti. Ova metoda će se vratiti pravi ako argument nije null i može se uspješno prebaciti na referentni tip bez podizanja a ClassCastException.

Pogledajmo kako možemo koristiti isInstance metoda sa sučeljem i klasama koje smo definirali:

@Test public void whenUsingIsInstanceProperly_desiredResultsHappen () {Oblik oblika = novi trokut (); Trokut trokut = novi Trokut (); IsoscelesTriangle isoscelesTriangle = novi IsoscelesTriangle (); Triangle isoscelesTriangle2 = new IsoscelesTriangle (); Oblik nespecificShape = null; assertTrue (Shape.class.isInstance (shape)); assertTrue (Shape.class.isInstance (trokut)); assertTrue (Shape.class.isInstance (isoscelesTriangle)); assertTrue (Shape.class.isInstance (izoscelesTriangle2)); assertFalse (Shape.class.isInstance (nonspecificShape)); assertTrue (Triangle.class.isInstance (oblik)); assertTrue (Triangle.class.isInstance (trokut)); assertTrue (Triangle.class.isInstance (jednakokračniTrikut)); assertTrue (Triangle.class.isInstance (izoscelesTriangle2)); assertFalse (IsoscelesTriangle.class.isInstance (oblik)); assertFalse (IsoscelesTriangle.class.isInstance (trokut)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle2)); }

Kao što vidimo, desna strana može biti ekvivalentna ili specifičnija od lijeve strane. Pružanje null prema isInstance metoda se vraća lažno.

4. Class.isAssnanaFrom

The Class.isAssnanableFrom metoda će se vratiti pravi ako je Razred s lijeve strane izjave isto je što je ili je superklasa ili super sučelje ponuđenog Razred parametar.

Koristimo naše satove s jeAssnanaFrom metoda:

@Test public void whenUsingIsAssignableFromProperly_desiredResultsHappen () {Oblik oblika = novi trokut (); Trokut trokut = novi Trokut (); IsoscelesTriangle isoscelesTriangle = novi IsoscelesTriangle (); Triangle isoscelesTriangle2 = new IsoscelesTriangle (); assertFalse (shape.getClass (). isAssignableFrom (Shape.class)); assertTrue (shape.getClass (). isAssignableFrom (shape.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (trougao.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (trougao.getClass (). isAssignableFrom (Shape.class)); assertTrue (trougao.getClass (). isAssignableFrom (shape.getClass ())); assertTrue (triangle.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (triangle.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (triangle.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (isoscelesTriangle.getClass (). isAssignableFrom (Shape.class)); assertFalse (izoscelesTriangle.getClass (). isAssignableFrom (shape.getClass ())); assertFalse (izoscelesTriangle.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (isoscelesTriangle.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (isoscelesTriangle.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (isoscelesTriangle2.getClass (). isAssignableFrom (Shape.class)); assertFalse (izoscelesTriangle2.getClass (). isAssignableFrom (shape.getClass ())); assertFalse (izoscelesTriangle2.getClass (). isAssignableFrom (trougao.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); }

Kao i kod isInstance na primjer, možemo jasno vidjeti da desna strana mora biti ista ili preciznija od lijeve strane. Također možemo vidjeti da nikada ne možemo dodijeliti svoje Oblik sučelje.

5. Razlike

Sad kad smo izložili nekoliko detaljnih primjera, pređimo na neke razlike:

  1. Da bi se koristila isInstance, moramo znati koja je od klasa u vrijeme sastavljanja.
  2. Samo jeAssnanaFrom može se koristiti s primitivima. To bismo trebali primijetiti ako koristimo primitive, metoda će se samo vratiti pravi ako je Razred objekt i Razred parametar su potpuno isti Razred.
  3. The jeAssnanaFrom metoda će baciti a NullPointerException ako je objekt koji se koristi s obje strane izraza null. Ako navedete a null prema isInstance metoda, vratit će se lažno.
  4. Trebali bismo razmišljati isInstance kao odgovor na pitanje je li navedeni objekt tipa s kojim ga uspoređujemo (bilo izravno ili putem sučelja ili nasljeđivanja). Možemo se sjetiti jeAssnanaFrom kao odgovor na pitanje možemo li klasu parametara definirati kao klasu objekta. Drugim riječima, volje Trokut trokut = novo IsoscelesTriange () sastaviti?

6. Zaključak

U ovom kratkom vodiču pogledali smo oba Razred.isInstance i Class.isAssnanaFrom metode i istražili njihovu uporabu i kako se razlikuju.

Kao i uvijek, primjer koda za ovu lekciju možete pronaći na GitHubu.


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