2017-06-23 4 views
1

私は、プライベートメソッドでいくつかの計算を行い、それがnullでないときにプライベートメソッドの戻り値をバブルアップする状況に直面することがよくあります。私が書きたい何コードスタイルJava:プライベートメソッドからの戻り値のバブリング

public String myMethod(int value) { 
    String tmp = strategy1(value); 
    if (tmp != null) { 
     return tmp; 
    } 
    tmp = strategy2(value) 
    if (tmp != null) { 
     return tmp; 
    } 
    return "default result" 
} 

private String strategy1(int value) { 
    return value > 1? "Good value" : null; 
} 

はこのような何か(動作しないJavaコード)

public String myMethod(int value) { 
    return if(strategy1(value) != null); 
    return if(strategy2(value) != null); 
    return "default result" 
} 

うまくこれを達成するための任意のベストプラクティスを次のとおりです。私はこれを行うよりもよりよい方法があるはずと感じ?

+0

またはちょうどあなた 'assertStuff'メソッドからブール値を返します。..その後、することができます'場合(assertStuff(値)!) // doFailureThings else \\ doNonFailureThings' –

+0

おそらく、assertはその場合の最適な言葉ではありません。プライベートメソッドは、実際には、私はそれがある場合にバブルアップしたいいくつかの値を生成する必要があります – A1m

+1

あなたは 'オプション'を探していますか? – baao

答えて

1

valueをメソッドに渡す必要がある場合は、nullの戻り値よりも例外をスローする必要がある場合は、nullを返してください。 で有効なJavaを読んでください。あなたは何かを検証しようとした場合、あなたはヌルで取引をすると、それにそれが動作しない外部のコードをご確認くださいより良いリターンブールだろう

public String myMethod(int value) { 
     if (value < 1) { 
      throw new IllegalArgumentException(); 
     } 
} 

:これを考えてみましょう、あなたのコードは、そのようなものでなければなりません。さらに良いアプローチは、あなたが値を取得しようとすると、それは悪いそれが例外をスローすることを、悪いときインターフェースValue

interface Value<T> { 

    boolean isValid(); 

    T getValue() throws IllegalStateException; 

} 
一定値をincapsulateと値が良いとき trueを返し

falseを作成することです

public boolean isValid(int value) { 
      return (value > 1); 
} 

;あなたが最初の戦略が戻った後、短circuiting--サポートすることを可能にするインターフェイスを使用して

public interface Strategy { 
    String evaluate(int); 
} 

public String firstResult(int candidate, String defaultValue, Strategy... strategies) { 
    for (Strategy strategy : strategies) { 
     String result=strategy.evaluate(candidate); 
     if (result!=null) return result; 
    } 
    return defaultValue; 
} 

:あなたの戦略は「戦略」インタフェースの実装であれば

+0

私は 'Value'インターフェースがより良いアプローチであるとは言わないでしょう、かなり過剰です。 IMO、 'Value'インターフェースを持っていれば、宣言的な代替:'値を公開するほうが良いでしょう。ifValid(realValue - > ...) '、'オプション#isPresent'に似ています。しかし、無効な入力に対する例外を示唆した+1は、メソッドが正しく実行されなかった場合には、 'boolean'を返す手続き的な方法を使用するのではなく、OOPを保持します。 –

+0

私は実際に 'myMethod'がnullを返すことを望んでいません。私はちょうど私的な方法でサブ計算をしたいと思っています。これは常に私のための定型文を作成します。 – A1m

+0

@ A1m「先に進む」とはどういう意味ですか?値を返すメソッドを持っている場合は、単に進めることはできません。値を返す必要があります。私が上記のコメントで示したように、より多くの宣言的なものがほしいかもしれません: 'processValue(myMethod()、value - > ...)'、値が存在すればコールバックを呼び出すだけです。値は存在しません。しかし、実際には、 'Optional'が必要なようです:' Optional value = Optional.of(myMethod()); 'これで' value.ifPresent(string - > ...) 'を実行できます。 –

0

は、あなたは、このようなユーティリティメソッドを使用することができますNULL以外の結果は、他の戦略のどれも処理されません。

のJava 8の使用:

System.out.println(firstResult(12, "snot-nosed kid", 
      age -> age >= 18 ? "adult" : null, 
      age -> age > 12 ? "teen" : null, 
      age -> age < 5 ? "pre-school" : null 
    )); 

のJava 7使用法:

Strategy strategy1=new Strategy() { 
     public String evaluate(int candidate) { 
      return candidate >=18 ? "adult" : null; 
     } 
    }; 
    Strategy strategy2=new Strategy() { 
     public String evaluate(int candidate) { 
      return candidate >12 ? "teen" : null; 
     } 
    }; 
    Strategy strategy3=new Strategy() { 
     public String evaluate(int candidate) { 
      return candidate < 5 ? "pre-school" : null; 
     } 
    }; 

    System.out.println(firstResult(12, "snot-nosed kid", strategy1, strategy2, strategy3));