😺

【Java】instanceof パターン・マッチングについて

に公開
2

instanceofとは?

オブジェクトが特定のクラスやインターフェースのインスタンスかどうかを調べるためのキーワード

基本構文

オブジェクトが指定したクラス(またはそのサブクラス)のインスタンスであればtrueを返し、それ以外なら false を返す

オブジェクト instanceof クラス名

使用例

インスタンスがどのクラスなのかチェック

スーパークラス:Animal

package instanceofTest;

public class Dog extends Animal {

}

サブクラス:Dog

package instanceofTest;

public class Dog extends Animal {

}
package instanceofTest;

public class InstanceofTest {
	public static void main(String[] args) {
		Animal animal = new Animal();
		Dog dog = new Dog();

		System.out.println(animal instanceof Animal); // true
		System.out.println(dog instanceof Dog); // true
		System.out.println(dog instanceof Animal); // true(DogはAnimalを継承している)
		System.out.println(animal instanceof Dog); // false(AnimalはDogではない)
	}
}

<出力例>

nullの場合

nullに対してinstanceofを使うと、falseになる
※Dogクラスは上記のものを使用

package instanceofTest;

public class InstanceofTest2 {
	public static void main(String[] args) {
		Dog dog = null;
		System.out.println(dog instanceof Dog); // false
	}
}

インターフェースをチェック

インターフェースを実装しているかどうかを判定
bird は Flyable インターフェースを実装

package instanceofTest;

interface Flyable {
}

class Bird implements Flyable {
}

public class InstanceofTest3 {
	public static void main(String[] args) {
		Bird bird = new Bird();
		//bird は Flyable インターフェースを実装している
		System.out.println(bird instanceof Flyable); // true
	}
}

型キャストの前に instanceof をチェックすることでClassCastExceptionを防ぐことが出来た。

Animal animal = new Dog();
if (animal instanceof Dog) {
    Dog dog = (Dog) animal; // 安全にキャストできる
}

instanceofパターン・マッチングとは?

Java16からinstanceofのパターン・マッチングが導入され、型チェックをしつつ簡潔にコードが書けるようになった

使用例

  • instanceofの判定と型キャストを1行で出来る
  • if のブロック内だけでstrを使用することが出来る
package instanceofTest;

public class PatternMatchingTest {
	public static void main(String[] args) {
		Object obj = "Hello, World!";

		if (obj instanceof String str) {
			System.out.println("文字列の長さ: " + str.length());
		} else {
			System.out.println("文字列ではありません");
		}
	}
}

<出力例>

https://zenn.dev/codek2/articles/7fbfa22ba62e69

Udemyで講座を公開中!
https://zenn.dev/codek2/articles/e9e44f3e0023fb

X(旧Twitter)
https://twitter.com/kunchan2_

Zenn 本
https://zenn.dev/codek2?tab=books

Youtube
https://www.youtube.com/@codek2_studio

Discussion