null 参照とインターフェースを実装していないオブジェクトの扱い
このステップでは、instanceof
キーワードが null
参照と、チェック対象のインターフェースを実装していないオブジェクトを扱う際の動作を調べます。これらのケースを理解することは、堅牢なコードを書くために重要です。
InterfaceCheck.java
ファイルを変更して、null
参照と、Printable
または Editable
のどちらのインターフェースも実装していないクラスのオブジェクトを含めましょう。
-
~/project
ディレクトリの InterfaceCheck.java
ファイルを開きます。
-
既存のコードを次のコードに置き換えます。
package project;
// Assume Printable and Editable interfaces and Document class are already defined
public class InterfaceCheck {
public static void main(String[] args) {
Object obj1 = new Document("Initial Content");
Object obj2 = "Just a String"; // Does not implement Printable or Editable
Object obj3 = null; // A null reference
Object obj4 = new Object(); // An object that does not implement Printable or Editable
System.out.println("Checking obj1 (Document):");
if (obj1 instanceof Printable) {
System.out.println("obj1 implements Printable");
} else {
System.out.println("obj1 does not implement Printable");
}
if (obj1 instanceof Editable) {
System.out.println("obj1 implements Editable");
} else {
System.out.println("obj1 does not implement Editable");
}
System.out.println("---");
System.out.println("Checking obj2 (String):");
if (obj2 instanceof Printable) {
System.out.println("obj2 implements Printable");
} else {
System.out.println("obj2 does not implement Printable");
}
if (obj2 instanceof Editable) {
System.out.println("obj2 implements Editable");
} else {
System.out.println("obj2 does not implement Editable");
}
System.out.println("---");
System.out.println("Checking obj3 (null):");
if (obj3 instanceof Printable) {
System.out.println("obj3 implements Printable");
} else {
System.out.println("obj3 does not implement Printable");
}
if (obj3 instanceof Editable) {
System.out.println("obj3 implements Editable");
} else {
System.out.println("obj3 does not implement Editable");
}
System.out.println("---");
System.out.println("Checking obj4 (Object):");
if (obj4 instanceof Printable) {
System.out.println("obj4 implements Printable");
} else {
System.out.println("obj4 does not implement Printable");
}
if (obj4 instanceof Editable) {
System.out.println("obj4 implements Editable");
} else {
System.out.println("obj4 does not implement Editable");
}
}
}
この更新されたコードでは、2 つの新しい Object
型の変数を追加しています。
obj3
には null
が代入されています。
obj4
には、カスタムインターフェースを実装していない基本の Object
クラスの新しいインスタンスが代入されています。
そして、これらの各オブジェクトに対して Printable
と Editable
の両方のインターフェースを instanceof
でチェックしています。
-
ファイルを保存します。
次に、更新されたコードをコンパイルして実行しましょう。
-
~/project
ディレクトリのターミナルを開きます。
-
Java ファイルをコンパイルします。InterfaceCheck.java
のみを変更したので、そのファイルだけをコンパイルしても構いませんが、3 つすべてをコンパイルしても問題ありません。
javac Printable.java Editable.java Document.java InterfaceCheck.java
-
InterfaceCheck
プログラムを実行します。
java InterfaceCheck
次のような出力が表示されるはずです。
Checking obj1 (Document):
obj1 implements Printable
obj1 implements Editable
---
Checking obj2 (String):
obj2 does not implement Printable
obj2 does not implement Editable
---
Checking obj3 (null):
obj3 does not implement Printable
obj3 does not implement Editable
---
Checking obj4 (Object):
obj4 does not implement Printable
obj4 does not implement Editable
obj3
(null
参照)の出力を見てください。オブジェクト参照が null
の場合、instanceof
演算子はチェック対象の型に関係なく false
を返します。これは instanceof
の重要な動作であり、チェックを行う際の NullPointerException
エラーを防ぎます。
また、obj4
(単なる Object
)の出力を見てください。予想通り、Object
クラスは Printable
または Editable
を実装していないため、instanceof
チェックは false
を返します。
このステップでは、instanceof
が null
参照で安全に使用でき、指定されたインターフェースを実装していないオブジェクトを正しく識別できることを示しています。