【问题标题】:velocity: tri-state Boolean property check速度:三态布尔属性检查
【发布时间】:2011-05-23 03:50:51
【问题描述】:

如何根据布尔属性可能具有的所有三种状态分叉三种不同的情况? 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. 获取一些空值,像这样,

    Object 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

【问题讨论】:

  • 嗯,我认为它的速度效率会降低,但最终使用枚举类型会更安全、更清洁......
  • 这样会降低效率吗?几乎可以肯定效率更高。
  • 好吧,我知道在 Android 等平台上不建议使用枚举类型,因为它比直接数值选项慢。我不确定两者在普通 java 环境中的速度差异,但可能是相似的,即使差异最终没有那么大。

标签: java velocity template-engine vtl


【解决方案1】:
!$foo.bool && $foo.bool != false

等价于

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

我猜这只是关于深夜编码和有些陈旧/简约的 Velocity 用户指南......

【讨论】:

  • 你可能想说!$foo.bool && ...
  • Velocity 用户指南肯定需要更新。
【解决方案2】:

每当我试图在不适合的地方硬塞一些东西时,我总是会后悔没有首先转移到更合适的状态。

给自己一个枚举,然后你可以明确地说它是 NOT_READY。明确是好的。在 cmets 上多写几行代码很棒。

另一个例子是——如果您想创建一个新类或在现有类中添加更多代码,您可能需要 2 或 3 个新类。

继续做吧。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 该字段有>>>三个
    【解决方案4】:

    如果您使用现代版本的 Velocity,您可以只使用 $null 或 $anyReferenceThatHasNoValue。您还可以使用#elseif 来简化事情:

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

    但说真的,无论你怎么切,这都是一种黑客行为。您应该使用枚举。

    【讨论】:

    • 哦,好吧,我自己已经指出了一种使用旧版本的方法
    猜你喜欢
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2019-11-15
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多