速度:トライステートのブールプロパティチェック
-
25-09-2019 - |
質問
ブール型プロパティが持つ可能性のある 3 つの状態すべてに応じて 3 つの異なるケースをフォークするにはどうすればよいですか?このための Java コードは単純に見えます。
public class Foo {
public Boolean getBool() { return null /* this would be dynamic in RL */; }
}
// somewhere in the servlet code:
if (foo.getBool() == null) {
resp.getWriter().print("not yet set");
} else if (foo.getBool()) {
resp.getWriter().print("set to TRUE");
} else {
resp.getWriter().print("set to FALSE");
}
仕様には null リテラルがなく、簡略化のためにブール値/非 null の等価性チェックがある程度代替可能であるため、Velocity はここで完全に失敗しているようです。もちろん、このジレンマを回避するには 2 つの解決策があります (下記を参照) が、何か簡単でクリーンな方法はあるでしょうか?
次のように、追加のゲッターを Foo クラスに追加するだけです。
ブール値 isBoolSet() {return getBool() != null;}
VTL コードは次のようになります。
#if(!$foo.boolSet)
not yet set
#else
#if($foo.bool)
set to TRUE
#else
set to FALSE
#end
#end
次のように、何らかの null 値をフェッチします。
オブジェクト getTheNull() {null を返す;}
VTL は次のようになります。
#if($foo.bool == $foo.theNull)
not yet set
#else
#if($foo.bool)
set to TRUE
#else
set to FALSE
#end
#end
解決
、あなただけの$ nullまたは$ anyReferenceThatHasNoValueを使用することができます。また、簡素化、物事に#elseifを使用することができます:
#if($foo.bool == $null)
not yet set
#elseif($foo.bool)
set to TRUE
#else
set to FALSE
#end
しかし、真剣に、これはあなたがそれをスライスハックどのような方法です。あなたは、列挙型を使用する必要があります。
他のヒント
私はそれが合わなかった靴べらものにしようとしたときはいつでも、私はいつもちょうど最初の場所で、より適切な状態に移行しない後悔終わってきます。
あなたは明示的にそれがNOT_READYだと言うことができ、自分で列挙型を与えます。明示的には良いです。コメントを超えるコードのいくつかの余分な行が素晴らしいです。
本の別の例はある - 。あなたは新しいクラスを作成したり、既存のクラスに多くのコードを置くことについて疑問に思うならば、あなたはおそらく2または3の新しいクラスを必要とする
ただ、先に行くとそれを行うます。
!$foo.bool && $foo.bool != false
と等価です
$foo.bool == $null (in Velocity 1.6 onwards)
私はそれがすべてだと思うちょうど約深夜コーディングとやや古い/最小限のVelocityユーザガイド...
なぜあなたは、コンストラクタ内であなたのブールを初期化いけませんか?その方法は、それがヌル
になることはありません