2010-12-09 67 views
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"); 
    } 

速度似乎epically失败在这里,作为规范,没有空文字和布尔/非空平等支票只用于简单起见有些互换。当然,有两种解决方案可以避免这种困境(见下文),但是有一些简单/更清晰的方法吗?

  1. 只需添加一个额外的消气剂Foo类,像这样:

    布尔isBoolSet(){返回getBool()= NULL;! }

和VTL代码将随后被:

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

    对象getTheNull(){返回NULL; }

,然后VTL会是什么样子:

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

嗯,我认为这将是少的速度效率,但最终这将是更安全和更清洁的使用enum类型... – 2010-12-09 22:11:04

+0

会以何种方式是效率较低?几乎肯定会更有效率。 – 2010-12-09 22:15:21

+1

好吧,我知道在像Android这样的平台中不推荐使用枚举类型,因为它比直接数值选项慢。我不确定在普通的Java环境中两者之间的速度差异,但可能它们是相似的,即使差异最终不是那么剧烈。 – 2010-12-10 01:08:15

回答

4

,你可以用$ null或$ anyReferenceThatHasNoValue。您还可以使用#elseif把事情简单化:

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

但严重的是,这是一个黑客,你切它的任何方式。你应该使用枚举。

1
!$foo.bool && $foo.bool != false 

相当于

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

我想这一切都只是深夜编码和有些陈旧/简约速度用户指南...

+1

你可能想说`!$ foo.bool && ...` – serg 2010-12-09 22:16:09

2

任何时候,我都试图对鞋子不适合的地方进行鞋拔,我总是会后悔不仅仅是首先转向更合适的状态。

给自己一个枚举,那么你可以明确地说,这是NOT_READY。显式是好的。评论中的一些额外的代码行很棒。

的另一个例子是 - 如果你有没有想过有关创建新类或把更多的代码在现有的类,你可能需要2个或3个新的类别。

只要继续做就可以了。

0

你为什么不初始化构造函数中的布尔?这样,如果你使用速度的现代版本,它永远不会为空