2011-10-21 20 views
0

次のコード行は、私のif文の一つである:GroovyまたはJavaで算術演算に安全なナビゲーション演算子はありますか?

$("#dateOfTransaction_month").val() != "${loadInstance?.payment?.dateOfTransaction?.getAt(Calendar.MONTH) + 1}" 

Javaの日付/時間管理は、私が正しい月を取得する+ 1を記述する必要があり、このような混乱ですので。問題は、paymentオブジェクトが存在しないことがあるため、基本的にはnull + 1と言います。これは私にエラーCannot invoke method plus() on null objectを与えます。 Groovyのsafe navigation operatorのような素敵な方法がありますかifステートメントでpaymentオブジェクトがnullである可能性を考慮することができますか、またはifステートメントの前に値がnullであるかどうかを確認する必要がありますか?

+0

month'は 'null'なのである'場合は、月+ '1'の結果をどう考えるでしょうか? –

+0

エラーの代わりに結果をnullにしたいと思います。私はdoelleriの答えはちょうどそれを行うと思います。 – ubiquibacon

答えて

7

のGroovyであることをデフォルトとなり

$("#dateOfTransaction_month").val() != "${(loadInstance?.payment?.dateOfTransaction?.getAt(Calendar.MONTH) ?: 0) + 1}" 

は何+演算子の呼び出しである日にプラス()メソッドを追加します。これを自分で直接呼び出すことができ、安全なナビゲーション演算子をチェーンすることができます。

$("#dateOfTransaction_month").val() != "${loadInstance?.payment?.dateOfTransaction?.getAt(Calendar.MONTH)?.plus(1)}" 

http://groovy.codehaus.org/groovy-jdk/java/util/Date.html#plus(int

+0

ああ、私はその方法を見ていない、これはエルヴィスのオペレータよりも優れている...非常にきれい!ありがとう! – ubiquibacon

0

厄介なJavaの日付とカレンダーのAPIを使用する問題を解決するには、JodaTimeをチェックしてください。組み込みのAPIと比較して作業することの夢です。

+0

私はGrailsのJodaTimeプラグインを試しましたが、なんらかの理由でSpring Security Coreプラグインと競合していました。私はその時点でそれをハッシングする気がしなかったので、私はちょうどJava/Groovy Date APIについていました。もっと重要なことが終わったら、JodaTimeプラグインをGrailsのためにもう一度試してみてください。 – ubiquibacon

-1

これは、Groovyについて私が本当に気に入っていたことの1つです。 null参照を自動的にテストした演算子です。

のJavaにはそのようなことはありませんが、あなたは自分がnull値をチェックするために横断されているものは何でもオブジェクト階層テストしている:

if (object1 != null && obecjt1.obecjt2 != null && object1.object2.object3 != null) 
    do_something_awesome_with(object1.object2.object3); 

しかし、あなたの例では、常にGroovyのため、トラブルを引き起こすことが起こっています?。演算子は、ヌル参照が発生した場合にトラバーサルを停止し、nullを返します。

1

実際にリンクしているのと同じページには、Elvis演算子(some-maybe-null-value?:default)があります。 エルヴィスでは、使用するデフォルト値を割り当てることができます。

その後、1月

+0

私はその演算子を試していましたが、正しく使用していませんでした。今正しく動作しているようです。ありがとう! – ubiquibacon