Java 速度:三态布尔属性检查

Java 速度:三态布尔属性检查,java,velocity,template-engine,vtl,Java,Velocity,Template Engine,Vtl,如何根据布尔属性可能具有的所有三种状态来分叉三种不同的情况?这方面的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

如何根据布尔属性可能具有的所有三种状态来分叉三种不同的情况?这方面的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在这里似乎失败了,因为规范没有空文本,为了简单起见,布尔/非空相等检查在某种程度上是可替换的。当然,有两种解决方案可以避免这种困境(见下文),但是否有一些简单/更干净的方法

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

    布尔值isBoolSet(){return getBool()!=null;}

  • 然后VTL代码将是:

    #if(!$foo.boolSet)
      not yet set  
    #else
      #if($foo.bool)
        set to TRUE
      #else
        set to FALSE  
      #end
    #end
    
  • 获取一些空值,就像这样

    对象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
    
    相当于

    $foo.bool == $null (in Velocity 1.6 onwards)
    
    我想这都是关于深夜编码和一些陈旧/极简的速度用户指南

    相当于

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

    我想这一切都是关于深夜编码和一些陈旧的/极简的速度用户指南…

    每当我试图把不合适的东西塞进某个地方时,我总是后悔没有一开始就转移到更合适的状态

    给自己一个枚举,然后你可以明确地说它还没有准备好。明确是好的。在注释上多写几行代码真是太棒了

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


    只要去做就行。

    每当我试图把不合适的东西塞进鞋里时,我总是后悔当初没有换到更合适的状态

    给自己一个枚举,然后你可以明确地说它还没有准备好。明确是好的。在注释上多写几行代码真是太棒了

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


    继续做吧。

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

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

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

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

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

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

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

    我认为这会降低速度效率,但最终使用枚举类型会更安全、更干净……以什么方式效率会降低?几乎可以肯定效率更高。嗯,我知道在Android等平台上不建议使用枚举类型,因为它比直接数值选项慢。我不确定在普通java环境中两者之间的速度差异,但可能是相似的,尽管差异最终没有那么大。好吧,我认为这会降低速度效率,但最终使用枚举类型会更安全、更干净……以什么方式会降低效率?几乎可以肯定效率更高。嗯,我知道在Android等平台上不建议使用枚举类型,因为它比直接数值选项慢。我不确定在普通java环境中两者之间的速度差异,但可能是相似的,尽管这种差异最终并没有那么大。您可能想说
    $foo.bool&…
    Velocity用户指南肯定需要一些更新。您可能想说
    $foo.bool&…
    Velocity用户指南肯定需要一些更新。字段有>>>三个字段有>>>三个哦,好的,我自己指出了使用旧版本的方法哦,好的,我自己也指出了使用旧版本的方法