Java : ブレースでローカルブロックが作れる
イマイチ良い単語が出てこなくてタイトルがよくわからない感じ。
「ニホンノエスイー」にありがちな手続き型の Java コードを見てたら珍しいモノを見付けた。
public hogeMethod(String str1, String str2) {
// 前処理
{
// 1つ目の引数の操作
String str = str1.toUpperCase();
// 何か処理
}
{
// 2つ目の引数の操作
String str = str2.toUpperCase();
// 何か処理 (str1 に対して行ってる処理と同じ)
}
// 後処理
}
「それぞれの引数に対して同じ処理をやってるならメソッドに外出ししましょうよ…」みたいなトコロが「ニホンノエスイー」のヤツなんだけど、おやっと思ったのはそこではないのだ!! (もうこういう酷いコードを見慣れてしまった…)
それぞれの引数の操作の所で、何かブレース「{}
」が出てきてる。それぞれのブロックを見ると String str
という同じ名前の変数を宣言している。同じメソッド内なのに重複しないのか。このブレースは何だ??
ネットで調べてもそれらしい情報が以下のページしか出てこなかった。最後はやっぱりひしだまさん。
- 裏Javaメモ(Hishidama's Java Memo) … 「同一ローカル変数」という章。
とげ括弧{ }によってブロックを作ると、その範囲だけで使えるローカル変数を定義できる。
ただし、同名のローカル変数(パラメーター(メソッドの引数)を含む)が既に定義されている場合は不可。
Java の場合、ブレースに囲まれたブロックがローカル変数のスコープになる。for 文における i
はその一種だし、if 文と else 文とで同じ変数名を使えるのはそれぞれをブレースで囲っているから。
つまり、// 1つ目の引数の操作
と // 2つ目の引数の操作
のそれぞれを囲むブレースがメソッド内でスコープを作るので、String str
はそれぞれのスコープ内でしか有効でないローカル変数になっていたのだ。
このブレースは何て呼んだらいいんだろう…。どうやって調べたらいいのかも分からなかったので、ココでは便宜的に「無名ブレース」とでも呼んでおこうかな。何かしら名前があれば「アレのこと」と言いやすいし。「無名ブロック」とか「ローカルブロック」とか呼び方がブレるかもしれないけど。
手続き型で長ったらしい処理を書く時なんかはこうやって変数のスコープを決めてあげると読みやすいのかもしれないが、そもそも「手続き型で長ったらしい処理を書く」こと自体が読みづらいので、この言語仕様・テクニックを有効に使える気がしない。