2016-11-08 3 views
2

編集:ifまたはelse ifのいずれかのステートメントがtrueの場合にのみ、finallyコードを実行します。Java - if文の 'Finally'と同等

多く何度も、私は次のような状況に遭遇:

if (condition1) 
    do stuff 
    do something 
else if (conditon2) 
    do other stuff 
    do something 
else if (condition3) 
    algorithm here 
    do something 

if文のfinally句があった場合、私はにそれを減らすことができる:

if (condition1) 
    do stuff 
else if (conditon2) 
    do other stuff 
else if (condition3) 
    algorithm here 
finally 
    do something 

私がしようとしていますdo somethingを追加のメソッドを作成せずに、一度だけ呼び出す必要がある解決策を見つけるか、ifステートメントを間違って実行するか、またはフラグを作成するなどの方法があります。

boolean special = false; 

if (condition1) 
     do stuff 
     special = true; 
else if (conditon2) 
     do other stuff 
     special = true; 
else if (condition3) 
     algorithm here 
     special = true; 

    if (special)   // <--- bad solution, doesn't simplify anything 
     do something 
+0

一連の 'if'ブロックと' else'ブロックの後に 'doSomething'を置くことはできませんか? –

+0

すべてのifの後に 'do something'を置くのはどうしてですか?一度だけ実行されます。 – Mritunjay

+4

@Mritunjay条件1、条件2、条件3がすべて偽であれば実行したくないと思うので、 – ajb

答えて

3

Javaは、フラグ変数せずにこれを達成することを可能にする構文、すなわちを持っています

doFinalAction: { 
    if (condition1) 
     do stuff 
    else if (conditon2) 
     do other stuff 
    else if (condition3) 
     algorithm here 
    else 
     break doFinalAction; 
    do something 
} 

ただし、使用する前に2度考えてください。多くの開発者はそれに精通しておらず、ほとんどの場合、あなただけのためにプログラミングしているわけではありません。何人かの人は、gotoというステートメントをあまりにも多く思い起こさせると思う人もいます。

よりクリーンなアプローチは、メソッドに「do something」を入れるだけです。 doSomething()と明示的に呼び出します。それだけで、単一のメソッド呼び出しだと、コードも大幅なしのバリアントよりも大きくない場合には

if (condition1) { 
    do stuff 
    doSomething(); 
} 
else if (conditon2) { 
    do other stuff 
    doSomething(); 
} 
else if (condition3) { 
    algorithm here 
    doSomething(); 
} 

コードの重複が許容されます。ところで

、時々、開発者が意図的に、さらに詳細なというのルートを行く:空白final変数は、コンパイラが1つの割り当てがまさにそこにあることを確認する明確な利点を持っているよう

final boolean special; 

if (condition1) { 
    do stuff 
    special = true; 
} 
else if (conditon2) { 
    do other stuff 
    special = true; 
} 
else if (condition3) { 
    algorithm here 
    special = true; 
} 
else special=false; 

if (special) 
    do something 

specialの宣言if(special) do somethingステートメントに達するすべてのコードパスは、偶発的な動作、つまり忘れられた割り当てまたは割り当てが後で矛盾して上書きされることを防ぐことができます。これは、if … else if …チェーンをswitchステートメントに変換するときに特に重要です。ステートメントでは、転倒の可能性があります。

+0

'break'の代わりに、ちょうど戻りでしょうか? – Taylor

+0

@Taylor:メソッドがこのコードのみで構成されている場合は、 'return'を使用できます。それ以外の場合、スキップしてはならないフォローアップコードが存在する可能性があります。 – Holger

+0

カプセル化!ブレークを使用するよりも全体をより簡潔にしますが、これは主観的です。 – Taylor

1
if (condition1) 
    do stuff 
else if (conditon2) 
    do other stuff 
else if (condition3) 
    algorithm here 
do something 

か、あなたがやりたいために特別な構文はありませんが、あなたは単一代入との最後の試みを書き換えることができます

if(condition1||condition2||condition3) 
    do something 
+0

ええ、これには何が問題なのですか?これは最終的には何ですか。 – Mritunjay

+0

かもしれません。何も説明がないためにdownvoted –

+2

Stack Overflowで質問に答えると、あなたは何かのやり方を教えています。私がプログラミングクラスを取り、先生が中かっこなしで一連のif/elseブロックを書くよう教えてくれたら、クラスを終了します。 @毒素、これはあなたがこのような答えを投稿した2番目の時間で、中括弧が欠けていると思います。 –

6

を有効にする条件の一つを持っている必要がある場合最終else支店で:これは、あなたのコードを簡素化するためん

boolean doFinally = true; 
if (condition1) 
    do stuff 
else if (conditon2) 
    do other stuff 
else if (condition3) 
    algorithm here 
else 
    doFinally = false; 

if (doFinally) 
    do something 

truespecial設定の繰り返し今はなくなってしまった。

+0

あなたは正しいですが、残念ながらこれはまだ私が「変数をフラグとして持つ」という意味になります。 – Hatefiend

+0

、さらには 'doSomething(doFinally);'? –

+0

正確に私が投稿しようとしていたもの。 :D –

5

あなたの第三の例:

boolean special = false; 

if (condition1) { 
    doStuff1(); 
    special = true; 
} else if (conditon2) { 
    doStuff2(); 
    special = true; 
} else if (condition3) { 
    algorithmHere(); 
    special = true; 
} 
if (special) { 
    doSomething(); 
} 

は実際にはかなり一般的なイディオムで、それについて「悪い」ものは何もありません、限り、あなたは実際の生活の中で(specialに記述名を与えるよう、つまり、Iドンここにはわかりやすい名前が必要です)。しかし、これが最善のことがあります条件の値を保持するためにif前に条件が複雑であるか、副作用を伴うことができれば、あなたは(説明的な名前で)boolean変数を定義する必要があることを条件とする

if (condition1) { 
    doStuff1(); 
} else if (conditon2) { 
    doStuff2(); 
} else if (condition3) { 
    algorithmHere(); 
} 
if (condition1 || condition2 || condition3) { 
    doSomething(); 
} 

、あなたの最後のifは可能な限り簡単です。これらの2つの間の選択と最初の例(すべてのブランチでdoSomething()を繰り返すことは非常に簡単です)は部分的にはスタイルの問題ですが、私は思ったものに応じて、特定の場合に最も適切であった。

ifステートメントの異なるブランチ間でコードを共有するというアイデアは、私が長い間考えていたと思っていたものですが、実際にそれを行う言語は見たことがありません(もし存在すれば、とにかく理解する)。 ifブランチのうちの2つにgotoを使用して3番目のブランチの共通コードにジャンプさせることは、私が最初に始めたときにプログラマがやったことをもう行わないことを嬉しく思っています。

-1

この構造は、あなたのメソッドの本体の端である場合は、あなたが返す使用することができます

{ 
    ... 
    if (condition1) { 
     doStuff1(); 
    } else if (conditon2) { 
     doStuff2(); 
    } else if (condition3) { 
     algorithmHere(); 
    } else 
     return; 

    doCommonTask(); 
}