最佳实践:hasXXX()方法,用于返回可能的null返回getXXX()方法

Mal*_*lax 3 multithreading

这个问题可能看起来很简单,但我还没有找到答案,所以我问堆栈溢出社区.正如标题所示,我有一个带有几个getXXX()方法的类,其中一些方法可能返回null.这是记录在案的,这个类的用户应该知道这个事实.

为了简化这个类的使用,我有想法添加一些方便的hasXXX()方法,指示是否设置了特定的字段.首先,这似乎是一个好主意......但是线程安全会浮现在脑海中.

由于此类的实例可能跨线程共享,因此属性的值可能会更改.我们都知道check-then-act只有在我们知道调用check-method之后状态不会改变时才有可能,即使我们在执行check-then-act之前被打断了.

我想到了以下解决方案:

  • 为此类用户提供一种在执行check-then-act代码时"锁定"状态更改实例的方法.
  • 删除hasXXX()方法,因为它们对于可变类是无用的.

我不认为这是一个罕见的案例,一些SO成员可能在此之前发现了这个问题,并找到了解决方案......

Foobaerchen

Tim*_*ley 10

没有必要使问题复杂化 - 用户知道XXX是否未设置,因为getXXX()返回null.


if ( (x=bar.getXXX()) ) {
   x.foo();
}
Run Code Online (Sandbox Code Playgroud)

是显而易见的


if ( bar.hasXXX() ) {
  bar.getXXX().foo();
}
Run Code Online (Sandbox Code Playgroud)

留下了xXX对想象力的真正作用


Mic*_*rdt 5

我肯定会删除这些hasXXX()方法.锁定事物会造成死锁的可能性,并且不容易纠正(更不用说它产生的可能的性能问题).

使用get方法并检查null是否有效,简单,快速,并且是一种众所周知的做事方式.消除NullPointerExceptions 的可能性是值得的,但往往是徒劳的.知道何时放弃它.