1

ブール型プロパティが持つ可能性のある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の等価性チェックはある程度代替可能であるため、速度はここでは明らかに失敗しているようです。もちろん、このジレンマを回避するための2つの解決策があります(以下を参照)が、いくつかの簡単でクリーンな方法はありますか?

  1. 次のように、Fooクラスにゲッターを追加するだけです。

    boolean isBoolSet(){return getBool()!= null; }

VTLコードは次のようになります。

#if(!$foo.boolSet)
  not yet set  
#else
  #if($foo.bool)
    set to TRUE
  #else
    set to FALSE  
  #end
#end
  1. そのように、いくつかのnull値をフェッチします。

    Object getTheNull(){nullを返す; }

VTLは次のようになります。

#if($foo.bool == $foo.theNull)
  not yet set  
#else
  #if($foo.bool)
    set to TRUE
  #else
    set to FALSE  
  #end
#end
4

4 に答える 4

4

最新バージョンのVelocityを使用する場合は、$nullまたは$anyReferenceThatHasNoValueを使用できます。#elseifを使用して物事を単純化することもできます。

#if($foo.bool == $null)
  not yet set  
#elseif($foo.bool)
    set to TRUE
#else
    set to FALSE
#end

しかし、真剣に、これはあなたがそれをスライスする方法でハックです。列挙型を使用する必要があります。

于 2010-12-10T17:31:33.280 に答える
2

合わないものを靴べらにしようとすると、そもそもより適切な状態に移行するだけでなく、いつも後悔することになります。

列挙型を指定すると、NOT_READYであると明示的に言うことができます。明示的は良いです。コメントの上に数行追加するのは素晴らしいことです。

このもう1つの例は、新しいクラスを作成したり、既存のクラスにさらにコードを追加したりすることを考えた場合、おそらく2つまたは3つの新しいクラスが必要になることです。

ただ先に進んでそれをしてください。

于 2010-12-09T22:32:02.957 に答える
1
!$foo.bool && $foo.bool != false

と同等です

$foo.bool == $null (in Velocity 1.6 onwards)

私はそれがすべて深夜のコーディングとやや古くてミニマルなVelocityユーザーガイドについてだと思います...

于 2010-12-09T22:07:47.110 に答える
0

コンストラクター内でブール値を初期化しないのはなぜですか?そうすれば、それがnullになることはありません

于 2010-12-09T22:35:18.877 に答える