こんにちは。今回はJavaのswitch文についてです。switch文はキーと値で条件分岐を記述する構文です。このブログでは以前に以下の記事でswitch文について書きました。
上記の最初の記事ではswitch文のキーにプリミティブ型のひとつであるint型を使いました。その次の記事ではswitch文のキーにint型のラッパークラスであるInteger型を使いました。
今回の記事ではswitch文のキーにString型や列挙型を使いました。この記事の前半ではキーにString型を使って動作確認をしました。後半ではString型を使った部分を列挙型に書き直して動作確認をしました。
目次
switch文のキーにString型を使う
例えば、ある試験の受験者の合否がデータとしてあるとします。合格者・不合格者に応じてメッセージを以下のように作るとします。
合否 | メッセージ |
---|---|
合格 | 合格おめでとうございます。 |
不合格 | 不合格です。 |
ここでは「合格」、「不合格」という文字列を引数にして、上記メッセージを返却するメソッドを作るとします。switch文で文字列を使うことができます。例えば、以下のようにswitch文を使ってメソッドを実装できます。
ソース
public class MyMsg {
public static String getMsg(String s) {
String msg = null;
switch (s) {
case "合格":
msg = "合格おめでとうございます。";
break;
case "不合格":
msg = "不合格です。";
break;
}
return msg;
}
}
上記プログラムではswitch文のキーにString型変数sを指定しています。caseラベルには文字列を記述しています。変数sの値が「合格」の場合、変数msgに文字列「合格おめでとうございます。」が格納されます。変数sの値が「不合格」の場合、変数msgに「不合格です。」が格納されます。最後にmsgを返却しています。
以下は動作確認です。
動作確認
public class MyMsgTest {
public static void main(String[] args) {
System.out.println(MyMsg.getMsg("合格"));
System.out.println(MyMsg.getMsg("不合格"));
}
}
結果
合格おめでとうございます。
不合格です。
getMsg()メソッドが実引数に応じたメッセージを返却していることが、出力結果で確認できました。このように、switch文にString型変数を指定でき、文字列に対応した条件分岐を記述できます。
なお、上記サンプルのメソッドは引数がnullでないことを前提にしています。引数にnullが指定された場合、switch文のキーがnullとなり、NullPointerExceptionが発生します。具体的には「Exception in thread “main” java.lang.NullPointerException: Cannot invoke “String.hashCode()” because “s” is null」というエラーメッセージが出力されます。
swicth文で使う列挙型を用意する
switch文では列挙型を使うことができます。上記サンプルのswitch文ではString型をキーにしましたが、それを列挙型に書き換えることをしました。
簡単に言うと、列挙型は定数の集まりを定義するクラスです。今回は「合格」、「不合格」を扱う列挙型MyJudgeを定義します。定数は以下の通りとします。
列挙型定数 | 説明 |
---|---|
PASSED |
合格 |
FAILED |
不合格 |
この表のように定数を持つ列挙型を以下のように作りました。
列挙型MyJudgeを定義
public enum MyJudge {
/**
* 合格
*/
PASSED,
/**
* 不合格
*/
FAILED;
}
以下は動作確認です。
動作確認
public class MyJudgeTest {
public static void main(String[] args) {
System.out.println(MyJudge.PASSED);
System.out.println(MyJudge.FAILED);
System.out.println("----------------------");
MyJudge myJudge = MyJudge.PASSED;
System.out.println(myJudge);
}
}
結果
PASSED
FAILED
----------------------
PASSED
上記サンプルでは最初に列挙型MyJudgeに定義した定数を出力しています。定数の定義そのものが文字列として出力されます。
つぎに、列挙型MyJudgeを変数の型として使っています。この変数には列挙型で定義した定数を代入できます。
swicth文で列挙型を使う
最初に作ったgetMsg()メソッドは引数とswitch文のキーがString型でした。この箇所を上記で定義した列挙型MyJudgeに書き換えることを考えます。実際には以下のように書き得ました。
列挙型をキーにした例
public class MyEnumToMsg {
public static String getMsg(MyJudge myJudge) {
String msg = null;
switch (myJudge) {
case PASSED:
msg = "合格おめでとうございます。";
break;
case FAILED:
msg = "不合格です。";
break;
}
return msg;
}
}
上記ではメソッドの引数の型をMyJudgeにしています。また、仮引数myJudgeをswitch文のキーにしています。
caseラベルには列挙型で定義されている定数を記述する必要があります。また、この個所は列挙型の名称を記述する必要はありません。例えば、「MyJudge.PASSED」と書いてしまうと、コンパイルエラーが発生します。その時のエラーメッセージは「修飾 case ラベル MyJudge.PASSED は 非修飾 enum 定数 PASSED と置き換えられる必要があります」です。
以下は動作確認です。
動作確認
public class MyEnumToMsgTest {
public static void main(String[] args) {
System.out.println("メッセージ1..." + MyEnumToMsg.getMsg(MyJudge.PASSED));
System.out.println("メッセージ2..." + MyEnumToMsg.getMsg(MyJudge.FAILED));
}
}
結果
メッセージ1...合格おめでとうございます。
メッセージ2...不合格です。
上記ではメソッドの引数にMyJudgeの定数を指定しています。結果を見ると、switch文により返却されるメッセージが切り替わっていることがわかります。
なお、switch文のキーに列挙型を指定した場合でも、キーがnullになる可能性があります。実際にキーがnulの場合はNullPointerExceptionが発生します。
以上、参考になれば幸いです。