Class.isInstance vs Class.isAssignableFrom
1. Bemutatkozás
Ebben a gyors bemutatóban megvizsgáljuk a különbségeket Class.isInstance és Class.isAssignableFrom. Megtudjuk, hogyan kell használni az egyes módszereket, és mi a különbség közöttük.
2. Beállítás
Állítsunk be egy interfészt és egy pár osztályt, amelyeket használhatunk a Class.isInstance és Class.isAssignableFrom funkcionalitás.
Először határozzunk meg egy interfészt:
nyilvános felület alakja {}
Ezután határozzunk meg egy osztályt, amely megvalósítja Alak:
a háromszög nyilvános osztálya alkalmazza az alakzatot {}
Most létrehozunk egy kiterjeszthető osztályt Háromszög:
nyilvános osztályú IsoscelesTriangle kiterjeszti a háromszöget {}
3. Class.isInstance
A isInstance módszer a Osztály osztály egyenértékű a Például az operátor. A isInstance módszert vezették be a Java 1.1-ben, mert dinamikusan használható. Ez a módszer visszatér igaz ha az érv nem nulla és sikeresen átküldhető a referencia típusra anélkül, hogy a ClassCastException.
Nézzük meg, hogyan használhatjuk a isInstance módszer az általunk definiált interfésszel és osztályokkal:
@Test public void whenUsingIsInstanceProperly_desiredResultsHappen () {Shape shape = new Triangle (); Háromszög háromszög = új Háromszög (); IsoscelesTriangle isoscelesTriangle = új IsoscelesTriangle (); Háromszög egyenlő szárú háromszög2 = új egyenlő szárú háromszög (); Alakzat nonspecificShape = null; assertTrue (Alak.osztály.isInstance (alakzat)); assertTrue (Alak.osztály.isInstance (háromszög)); assertTrue (Alak.osztály.isInstance (egyenlő szárú háromszög)); assertTrue (Alak.osztály.isInstance (egyenlő szárú Háromszög2)); assertFalse (Alak.osztály.isInstance (nonspecificShape)); assertTrue (Háromszög.osztály.isInstance (alak)); assertTrue (Háromszög.osztály.isInstance (háromszög)); assertTrue (háromszög.osztály.isInstance (egyenlő szárú háromszög)); assertTrue (háromszög.osztály.isInstance (egyenlő szárú háromszög2)); assertFalse (IsoscelesTriangle.class.isInstance (shape)); assertFalse (IsoscelesTriangle.class.isInstance (háromszög)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle2)); }
Ahogy látjuk, a jobb oldal egyenértékű vagy specifikusabb lehet, mint a bal oldal. Gondoskodás nulla hoz isInstance metódus visszatér hamis.
4. Class.isAssignableFrom
A Class.isAssignableFrom módszer visszatér igaz ha a Osztály az utasítás bal oldalán megegyezik a megadott szuperosztályával vagy szuperinterfészével Osztály paraméter.
Használjuk az osztályainkat a isAssignableFrom módszer:
@Test public void whenUsingIsAssignableFromProperly_desiredResultsHappen () {Shape shape = new Triangle (); Háromszög háromszög = új Háromszög (); IsoscelesTriangle isoscelesTriangle = új IsoscelesTriangle (); Háromszög egyenlő szárú háromszög2 = új egyenlő szárú háromszög (); assertFalse (shape.getClass (). isAssignableFrom (Shape.class)); assertTrue (shape.getClass (). isAssignableFrom (shape.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (egyenlő szárú háromszög2.getClass ())); assertFalse (triangle.getClass (). isAssignableFrom (Shape.class)); assertTrue (triangle.getClass (). isAssignableFrom (shape.getClass ())); assertTrue (triangle.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (triangle.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (triangle.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (egyenlő szárú Háromszög.getClass (). isAssignableFrom (Alak.osztály)); assertFalse (egyenlőségű háromszög.getClass (). isAssignableFrom (shape.getClass ())); assertFalse (isoscelesTriangle.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (isoscelesTriangle.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (isoscelesTriangle.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (egyenlő szárú Háromszög2.getClass (). isAssignableFrom (Alak.osztály)); assertFalse (egyenlőségűTriangle2.getClass (). isAssignableFrom (shape.getClass ())); assertFalse (egyenlőségűTriangle2.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); }
Mint a isInstance Például világosan láthatjuk, hogy a jobb oldali oldalnak azonosnak vagy specifikusabbnak kell lennie, mint a bal oldali. Azt is láthatjuk, hogy soha nem vagyunk képesek kijelölni a feladatunkat Alak felület.
5. A különbségek
Most, hogy bemutattunk néhány részletes példát, nézzük át a különbségeket:
- Használata érdekében isInstance, tudnunk kell, hogy mi az egyik osztály fordítási időben.
- Csak isAssignableFrom primitívekkel használható. Meg kell jegyeznünk ha primitíveket használunk, akkor a módszer csak visszatér igaz ha a Osztály tárgy és Osztály paraméterek pontosan megegyeznek Osztály.
- A isAssignableFrom módszer dobja a NullPointerException ha a kifejezés mindkét oldalán használt objektum az nulla. Ha megadja a nulla hoz isInstance módszerrel visszatér hamis.
- Gondolkodnunk kellene isInstance válaszként arra a kérdésre, hogy a megadott objektum az a típus, amelyhez összehasonlítjuk (akár közvetlenül, akár interfészen, vagy öröklésen keresztül). Eszünkbe juthat isAssignableFrom válaszként arra a kérdésre, hogy definiálhatjuk-e a paraméterosztályt objektumosztályként. Más szóval akarat Háromszög háromszög = új egyenlőségű háromszög () összeállítani?
6. Következtetés
Ebben a rövid bemutatóban megnéztük mind a Class.isInstance és Class.isAssignableFrom módszereket, és feltárta azok használatát és miben különböznek egymástól.
Mint mindig, az oktatóanyag példakódja megtalálható a GitHubon.