ラベル付きのbreakステートメントの使用は強くお勧めしません。GOTOとほぼ同じくらい悪いです。1回の休憩。ループやスイッチなどを終了するのに問題はありません。しかし、私の経験では、このようなラベルの付いたブレークの必要性は、制御フローの設計が悪いことを示しています。
ほとんどの場合、適切に配置された例外の方が意味があります。しかし、ただ、「ジャンプ条件」がエラーと見なされる場合。メソッドを正しくラベル付けすると、エラーと見なされるかどうかに影響を与えることができます。
メソッドが「getDrink()」と呼ばれ、「milk」オブジェクトを返す場合は、問題ありません。ただし、メソッドが「getWater()」と呼ばれる場合、ミルクを返す代わりに例外をスローする必要があります...
したがって、代わりに:
public class TestBad {
public static void main(String[] args) {
String[] guys = {"hans", "john"};
myLabel: {
for(String guy: guys) {
String drink = getDrink(guy);
if(drink.equals("milk")) {
// Handle "milk"??
break myLabel;
}
// Do something with "non-milk"
}
}
// Success? Non Success??
}
private static String getDrink(String guy) {
if(guy.equals("hans"))
return "milk";
else
return "water";
}
}
次を使用する必要があります。
public class TestGood {
public static void main(String[] args) {
String[] guys = {"hans", "john"};
try {
handleStuff(guys);
} catch (Exception e) {
// Handle Milk here!
}
}
private static void handleStuff(String[] guys) throws Exception {
for(String guy: guys) {
String drink = getWater(guy);
// Do something with "water"
}
}
private static String getWater(String guy) throws Exception {
if(guy.equals("hans"))
// The method may NEVER return anything else than water, because of its name! So:
throw new Exception("No Water there!");
else
return "water";
}
}
Fazit:ブロックをブロックまたは複数のループにネストする代わりに、メソッドをネストして適切な例外処理を使用する必要があります。これにより、読みやすさと再利用性が向上します。