1

如何根据布尔属性可能具有的所有三种状态分叉三种不同的情况?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");
    }

Velocity 似乎在这里失败了,因为规范没有 null 文字,并且为了简单起见,布尔/非 null 相等检查在某种程度上是可替代的。当然,有两种解决方案可以避免这种困境(见下文),但是有一些直接/更清洁的方法吗?

  1. 只需向 Foo 类添加一个额外的 getter,如下所示:

    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. 获取一些空值,就像这样,

    对象 getTheNull() {return 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。明确是好的。注释上的几行额外代码很棒。

另一个例子是——如果您想创建一个新类或在现有类中添加更多代码,您可能需要 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

为什么不在构造函数中初始化布尔值?这样它就永远不会为空

于 2010-12-09T22:35:18.877 回答