2011-07-21 25 views
4

我正在开发一个Android应用程序,我只是碰到了一些东西。我有一些匿名类(事件监听器)。他们从数据库参数化。我所做的是这样的:布尔与布尔(s)作为trilean开关

buttonA.setOnTouchListener(new View.OnTouchListener() { 
         private Boolean isActive = null; 
         private boolean isTrigger; 
         private int onLevel; 
         private int offLevel; 
         private int chIdx; 

         @Override 
         public boolean onTouch(View v, MotionEvent event) { 
          if (isActive == null) { 
           Cursor btnSettings = dbHelper.getButtonsTable().fetchButton(1, profileId, currentMode); 
           ... 
... 
          } 
          return true; 
         } 

是它认为是一个很好的做法,使用Boolean对象为trilean开关(它如果听者尚未参数化的空值)或者我应该用两个布尔变量...或者可能是一个整数?

你有什么想法吗?

+1

'Boolean'持有'null'可能是Resign模式中的一个雷管模式示例http://fuzz-box.blogspot.com/2011/05/resign-patterns.html –

+1

我不熟悉Android,但你似乎正在从GUI事件线程调用数据库提取,这可能导致你的界面变得无法响应。 – toto2

+0

这只是一个备用代码的原型,但感谢通知! –

回答

14

最好,使用一个类型(可能是枚举)与三个状态的准确描述。布尔人不会给正在调用该函数的人提供很多信息(特别是在用作三态时)。

public enum ActiveStatus { 
    On, 
    Off, 
    Unknown 
} 
+0

优秀的答案,谢谢!我不知道为什么它没有出现在我的脑海里。 –

+0

这也是Effective Java 2nd Edition中推荐的方法。请注意,枚举*常量*通常是大写的。 –

4

我会说使用布尔与true,false和null或使用枚举。我倾向于使用布尔值作为一种“还不知道”的空值。如果你使用null作为比“不知道”更有意义的事情,你可能在语义上更适合使用枚举。

+0

我会同意的,但是发现在布尔值中使用null有多危险。由于自动拆箱,你往往会忘记这个thrid状态太快,并在布尔型(小写字母b)的情况下使用它,在这种情况下,你最终会遇到NullPointerException异常。更好地使用Enum! – Zordid

+0

或者如果您确实需要,请在Java 8中使用'Optional ',但枚举仍然更好。 –

0

null不是“未指定值”,对于任何对象类型(包括Boolean),它都是“完全没有价值”。因此,在使用Boolean对象时,您仍然只有两个有意义的值。

您应该使用多个布尔标志或枚举。

2

这里我们必须使用一个变量来表示三个状态值中的任何一个:ON,OFF或UNKNOWN。我们也知道变量除了这三个值之外不能取任何值。所以,我们可以说这三个值是状态变量可以映射到的值的范围。当我们考虑其他数据类型(如int,char等)时,它们也具有预定义的值范围。因此,在这种情况下,我们需要创建一个具有这三个值的自定义数据类型作为其范围。在这些场景中使用枚举,可以定义为Jeff Foster编写的:

public enum ActiveState { 
    ON, OFF, UNKNOWN 
} 
0

这被认为是我的一个好习惯。

您的数据类型为true或false或未指定,可为null的布尔值完全适合。

+0

我会同意的,但是发现在布尔运算中这种null的使用有多危险。由于自动拆箱,你往往会忘记这个thrid状态太快,并在布尔型(小写字母b)的情况下使用它,在这种情况下,你最终会遇到NullPointerException异常。更好地使用Enum! – Zordid

1

在Java 8,我建议使用Optional <布尔>:

//Declaration: 
Optional<Boolean> v; 

//Setting: 
v = Optional.empty(); //null 
v = Optional.<Boolean>empty(); //null again 
v = Optional.of(true); 
v = Optional.of(false); 
// (you may declare Trileans class with these constants) 

//Checking: 
if (v.isPresent()) /*v is not null*/; 
if (v.isPresent() && v.get()) /*v is true*/; 
if (v.isPresent() && !v.get()) /*v is false*/; 
if (v1.equals(v2)) /*v1 and v2 are the same*/; 
// (you may declare Trileans class with more operations) 

对于Android的你大概可以写自己的可选类(不知道,但是,无论是最佳的解决方案)。