ラベルというものがどうやらあるらしい【Java】
まだまだ寒い日が続く近頃、ミケはJava Silverの勉強をしていました。
ミケ:いままでJavaの記事書いてたけど、そういえば資格とかなんも持ってないってことに気づいたなぁ。
ミケ:なんか問題のコードとか汚くて読みにくいんだよね。まぁあたりまえだけどさ。
ずっと愚痴を言いながらもなんだかんだ解いています。
ミケ:ん?なんだこれ?
public class Main{
public static void main(String[] args){
int total = 0;
a: for(int i=0;i<5;i++){
b: for(int j=0;j<5;j++){
if(i%2==0)continue a;
if(3<j)break b;
total+=j;
}
}
System.out.println(total);
}
}
ミケ:むう?なんかコロンとかついてるぞ。これひっかけ問題で実はエラーとかなのか!
ミケ:となると、選択肢はDだな。
ミケ:どれどれ、答えは…? え、B!?なんで?
ミケ:ラベル?なんだそれ!
どうやらミケが全く知らないラベルというものが出てきたようです。
ラベルとは
ミケ:ということでラベルについて調べてみたよ!
ラベルっていうのはfor文とかwhile文の多重ループを抜ける際に指定するfor,while文の場所を示すものだよ。
例えばだけど、二重ループの内側でbreakした場合には、普通なら内側のループだけ抜けるよね。でも、ラベルを使えば外側のループまで一気に抜けることができるんだ!
//ラベルを使わない場合
boolean isLoop=true;
for(int i=0;i<5;i++){
if(!isLoop)break;
for(int j=0;j<5;j++){
if(j==3){
isLoop=false;
break;
}
System.out.println(i+":"+j);
}
}
//ラベルを使う場合
loop:for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(j==3)break loop;
System.out.println(i+":"+j);
}
}
試しに上のコードを実行してみると、同じ挙動をしていることがわかるね!
ラベルを使うことで、ループを制御していた変数isLoopを完全に削除できたね。コードもコンパクトに収まってる!
ラベルはいろんな場所につけれる
ラベルは、ループ以外にもいろいろな箇所につけられるみたいだよ。
コードブロック
すべてのループ文と分岐文
式
代入
return文
tryブロック
throw文
わお、たくさんあるね~。ちなみにコードブロックは、コードの塊を表すために{}で囲った範囲のところだよ。
これを用いれば、if文のブロックだけ抜ける、なんてこともできそうだね。
ラベルの乱用は可読性を下げる
こう聞くと、ラベルは便利そうだけど、実際にはあまり使い道はなさそうだね。僕も知らなくてもそんな問題にならなかったし。
しかもラベルって、コードの制御があちこちに飛んじゃうから普通に見にくいよね。C言語のgoto文みたいな感じだし。
適切な時にだけ使うっていうのがベストなのかもね。ただその適切な場合を見分けるのが難しそうだけどね。
終わりに
ミケ:ふぅ。今日は学びのある日だったなぁ。
ミケ:ただ、あんまり僕はこのラベル使いたくはないなぁ(笑)なんか見にくいもん。
ガチャ…
マロ:ただいま~。今日は近くの猫からカツオをもらってきたよ~!
ミケ:おお!カツオ!やったぁ~!
マロ:そんなにあわてないでw
…
こうして、飼い主さんがかえってくるまでのひと時、マロの持ってきたカツオを二人で分けて食べました。あとで散らかしすぎて飼い主さんに怒られたのは内緒です(笑)
誤字脱字、間違いや質問等は遠慮なくどうぞ。
ミケ
この記事が気に入ったらサポートをしてみませんか?