2016-10-10 3 views
1

私は変数xを持っています。値を2回確認せずにこのJavaの条件を表現する最も簡潔な方法

m()xが2つの可能な値のいずれかである場合にのみ呼び出してください。

m()を呼び出すとき、その値がxの値に依存する引数を渡します。

xの値を複数回チェックしたり、m()を1か所だけ呼び出すか(つまりifステートメントの複数の枝にはない)、Javaでこれを行う方法はありますか?

一つの解決策私は楽しまよ:

switch (x) { 
    case 1: 
    y = "foo"; 
    break; 
    case 2: 
    y = "bar"; 
    break; 
    default: 
    y = null; 
    break; 
} 

if (y != null) m(y); 

しかし、私は助けるが、これはちょうど第2のチェックのために、「プロキシ」を追加することによって、この事実を曖昧に、二回xをチェック技術的にで感じることができません。

(なぜ制約があるのか​​を明確にするために:コードを読むときは、ブランチ間で重複度が高いときに分岐するロジックを理解するのが苦労します。私はRuby、JS、および他の言語でうまく機能する習慣である、そのような複製を積極的にリファクタリングすることを好む;私は同じことをすることを学ぶことができると期待している私と他の人のためのJavaと簡単にコードを作るには、一目で理解する。)

+1

'Map 'を作成し、 '1'と' 2'の値を入力して 'map.get(x)'を使用します。 –

+1

@ElliottFrischマップは、2つの別個の 'if'ステートメントでロジックを破るよりも本当に良い解決策ですか?それがたくさん起こった場合私は理解するだろうが、この場合の少量のためにあなたのソリューションは本当に面白いですか? – MadJlzz

+2

あなたの最初の例はまったく機能しません.1と2の両方で同じ結果になります。 –

答えて

1

使用「後藤」または同等の「X」から「Y」パラメータを取得するにはマップを使用することができるものの。必要に応じてm()、またはyまたはnullという名前に応じてtrueまたはfalseを返すように変更するのも簡単です。


いくつかは、これがループ構造の乱用であると言うかもしれない、とあなたはそれに応じてコメントしなければならないのにあなたはまた、ループ構造でトリックを行うことができます。

do { // note: not a real loop, used to skip call to m() 
    switch (x) { 

    case 1: 
     y = "foo"; 
     break; 

    case 2: 
     y = "bar"; 
     break; 

    default: 
     continue; // "goto equivalent" part 
    } 

    m(y); 
} while(false); 
+0

うわー、かわいい。周囲のスコープをフロー制御ツールとして使用し、ブロックの継続を使用して「適切な値が見つかる」ことを暗示しています。 – henrebotha

+0

この回答を受け入れるのは、ほとんどの共通言語に存在するツールのみを使用して、すべての要件を満たしながら、最も奇妙なものです。 – henrebotha

-1

ない

switch (x) { 
    case 1: 
    y = "foo"; 
    m(y); 
    break; 
    case 2: 
    y = "bar"; 
    m(y); 
    break; 
} 
+0

私は記事の中でこう言っています。あなたが行ったように、複数の場所で 'm()'を呼びたくはありません。 – henrebotha

+0

私の悪い、私はあなたが一度だけ(コード内の1つの場所を持っているとは限らない)それを呼びたいと思っていたことを意味していたと思った。 – Crazycolorz5

+0

これをもっと明確にするために投稿を編集します。 :) – henrebotha

3

は、私はよく分からない理由上記

void do_m_if_appropriate() { 

    // x and y are assumed to be eg. member variables 

    switch (x) { 

    case 1: 
     y = "foo"; 
     break; 

    case 2: 
     y = "bar"; 
     break; 

    default: 
     return; // this is the "goto equivalent" part 
    } 

    m(y); 
} 

はかなりエレガントです:あなたがしたいが、あなたは多分

Map<Integer, String> map = new HashMap<>(); 
map.put(1, "foo"); 
map.put(2, "bar"); 

if (map.containsKey(x)) { 
    m(map.get(x)); 
} 
+0

私のRuby開発者はこれを愛しています。 – henrebotha

+0

あなたがこのようにお会いしてうれしいです;)地図はときどき問題を解決するために非常に効率的になることがあります – Jos

+2

@Jos私はこれを効率的に呼び出すつもりはありません...簡潔で簡潔です。 – hyde

1

ここOptionalsと解決策(私のJavaのです構文が多少間違っている可能性があります)。あなたには、コードはそうであるように見えるが、実装は賢明である。つまり、あなたが投稿した例に似ている(つまり、yが例外的な値であるかどうかをチェックする)。

switch (x) { 
    case 1: 
    y = Optional<String>.of("foo"); 
    break; 
    case 2: 
    y = Optional<String>.of("bar"); 
    break; 
    default: 
    y = Optional<String>.empty(); 
    break; 
} 
y.map((m's class)::m); 
result = y.orElse(<value result should take if x was invalid>); 

実際にはオプションを返すとyが有効でない場合は単に空返すように)(メートルを変更した方が良いかもしれないが、私はあなたがこのチェックの発信者側をしたいと仮定します。

関連する問題