Javaのinstanceofを分かりやすく解説!|安全なJavaプログラミングをしよう

- システム
エンジニア - Javaで、インスタンスのクラス型が違う場合はどうすればいいです。
- プロジェクト
マネージャー - instanceofを使えばいいです。では、具体的にinstanceofの使い方や応用について解説しましょう。
Javaのinstanceofとは?
JavaはどんなクラスのインスタンスもObject型で扱える便利な言語です。ただし、あるObject型のインスタンスが実際は違うクラス型の場合もあります。そう言った時に型を調べるにはどうしたらよいのでしょうか。
その場合は、instanceofを使えば解決します。この記事ではinstanceofの使い方とその応用、具体的な使用例を紹介するので是非ご覧ください。
instanceofの簡単なサンプル
以下はinstanceofの簡単なサンプルです。
Object o = “test”;
if (o instanceof String) {
System.out.println(o);
}
このJavaサンプルを実行すると、testと表示されます。oはObject型の変数ですが、その実体の”test”はString型の文字列です。そのためinstanceofでString型とtrue判定され、if文の処理が実行されたということになります。
変数がnullだった場合は?
もしinstanceofでチェックする変数が以下のようにnullだったら、どうなるのでしょうか?
String s = null;
if (s instanceof String) {
System.out.println(s);
}
このJavaサンプルを実行しても、何も表示されません。sはString型ですが、実体がnullのためinstanceofの判定はfalseとなるのです。
instanceofは親クラスもチェックできる
instanceofはインスタンスの型だけでなく、その型の親クラスをチェックすることもできます。以下のJavaサンプルをご覧ください。
Integer intVal = Integer.valueOf(3);
Short shortVal = Short.valueOf((short)5);
Float floatVal = Float.valueOf(8.0f);
Object[] ary = new Object[3];
ary[0] = intVal;
ary[1] = shortVal;
ary[2] = floatVal;
int sum = 0;
for (int i = 0; i < ary.length; i++) {
if (ary[i] instanceof Number) {
sum += ((Number)ary[i]).intValue();
}
}
System.out.println(“sum is “+sum);
親クラスをチェックすれば安全に処理ができる
上のJavaサンプルを解説します。まずInteger型・Short型・Float型のクラスのインスタンスを生成し、それらをObject型の配列aryに格納します。そしてaryの中身を順にinstansofで親クラスがNumber型かどうかチェックします。
Integer型・Short型・Float型の親クラスは全てNumber型なのでinstanceofの判定trueになります。そしてary型をNumber型にキャストし、Number型のinvValueメソッドをコールして戻り値をsumに加算します。
間違った型でキャストすると例外が発生する
このJavaサンプルの実行結果は”sum is 16″になります。3とshort型の5とfloat型の8がint型として合計されたということです。もし仮にNumber型が親クラスではないインスタンスをNumber型でキャストすると、ClassCastExceptionが発生します。
instanceofのおかげで安全に処理ができているということです。
instanceofはインターフェイスの実装もチェックできる
instanceofは親クラスのチェックだけでなく、インターフェイスを実装しているかどうかもチェックできます。
以下のJavaサンプルをご覧ください。なお実行する時は先頭に「import java.io.*;」が必要です。
Integer intVal = Integer.valueOf(123);
if (intVal instanceof Serializable) {
try {
// バイト配列で書き込む
File file = new File(“c:\\test\\serial_file”);
ObjectOutputStream ost = new ObjectOutputStream(new FileOutputStream(file));
ost.writeObject(intVal);
ost.close();
// バイト配列を読み込む
ObjectInputStream ist = new ObjectInputStream(new FileInputStream(file));
Object o = ist.readObject();
ist.close();
if (o instanceof Integer) {
System.out.println(“serial value is “+((Integer)o).intValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}
instanceofはシリアライズ処理で役立つ
JavaにはSerializableというインターフェイスがあります。これを実装しているとインスタンスをファイルに書き込み、それを読み込んで復元できます。このサンプルはそれを行っています。それでは説明しましょう。
まずInteger型の値が123のインスタンスを生成しています。そしてそれがSerializableを実装しているかinstanceofで、チェックしています。実装していれば、ObjectOutputStreamでファイルにインスタンスを書き出します。これをシリアライズすると言います。
instanceofにより安全に処理できる
その後、ObjectInputStreamでObject型として読み込みます。これをデシリアライズと言います。そしてinstanceofでInteger型であるかどうかをチェックし、そうであればInteger型でキャストし、intValueメソッドで値を取得します。
実行結果は、
serial value is 123
となります。ClassCastExceptionを発生させないように、instanceofがこういったケースで役立つことがわかります。
instanceofの他の利用方法
instanceofの他の使用例を紹介します。以下のJavaサンプルをご覧ください。
Object[] ary = new Object[10];
for (int i = 0;i < ary.length; i++) {
if (i%2==0) {
ary[i] = “” + i;
}
else
{
ary[i] = Integer.valueOf(i);
}
}
int sum = 0;
for (int i = 0; i < ary.length; i++) {
if (ary[i] instanceof String) {
sum += Integer.valueOf((String)ary[i]);
}
else if (ary[i] instanceof Integer) {
sum += ((Integer)ary[i]).intValue();
}
}
System.out.println(“sum is “+sum);
複数の型が混在していてもinstanceofで対応できる
上のJavaサンプルは色々な型が混在している場合にinstanceofで個別対処することを想定したものです。解説すると、まずObject型の配列aryにString型の数字とInteger型の数値を交互に入れています。i%2を2で割った余りを取得し、””+iでint型を文字列に変換しています。
その後、配列aryを全部instanceofでチェックし、String型ならInteger.valueOfメソッドで数値に変換し、IntegerならintValueメソッドで値を取得します。
最後に値の合計を表示します。”sum is 45″と表示されます。このようにinstanceofは複数の型が混在する時に便利に使えるのです。
- システム
エンジニア - instanceofはとても便利ですね。
- プロジェクト
マネージャー - 複数の型が混在する時でも便利に使えます。
instanceofで安全なJavaプログラミングをしよう
instanceofの使い方について解説しましたが、ご理解できましたでしょうか。
instanceofを使用すれば間違ったキャストを行ってClassCastExceptionが発生する事態を避けることができます。安全なJavaプログラミングのために是非活用してください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)