0

我正在尝试编写越来越少的代码,并且正在尝试找到一种防止崩溃的方法。

我遇到的一个例子是:

public class MyClass
{
   private User user;

   public MyClass()
   {
       // Get user from another class
       // Another thread, user can be null for couple of seconds or minutes
       // Asynchronous call
       user = AnotherClass.getUser();

       // start method
       go();
   }

   private void go()
   {
      // Method 1
      // Program it is crashing if user is null
      if (user.getId() == 155)
      {
         // TO DO
      }
      else
      {
         System.out.println("User is NOT 155 !");
      }

      // Method 2
      // Program still crashes if user is null
      if (user != null && user.getId() == 155)
      {
         // To do
      }
      else
      {
         System.out.println("user is not 155");
      }

      // Method 3
      // Program wont crash, but I write much more code !
      if (user != null)
      {
         if (user.getId() == 155)
         {
            // To do
         }
         else
         {
            System.out.println("User is not 155 !");
         }
      }
      else
      {
          System.out.println("User is not 155 !");
      }
   }
}

如您所见,方法 3 有效,但我正在编写更多代码……我该怎么办?

4

3 回答 3

2

首选 短路评估的方式,即方法2。

AND函数的第一个参数计算结果为false时,整体值必须为false

      if (user != null && user.getId() == 155)
      {
         // To do
      }
      else
      {
         System.out.println("user is not 155");
      }

这是最可取和可读的代码。

您认为 method2 崩溃并且 method3 有效的假设是错误的。在上面的代码中 if user != null then 只user.getId() == 155 执行。

于 2013-10-23T14:04:23.393 回答
1

为什么不在这里使用空对象模式,而不是将用户设置为空,而是将其设置为User对象的特殊“空”情况(实现)?

例如

user = AnotherClass.getUser();
if (user == null) {
   user = new NullUser();
}

(理想情况下,AnotherClass.getUser() 会在内部进行空值检查)

在这种情况下

user.getId()

可以返回一个永远不会等同于有效用户 ID 的特殊值(-1 ?)。因此,您的代码将始终如下所示:

if (user.getId() == 155)

这同样适用于User对象上的其他方法。

于 2013-10-23T14:04:04.393 回答
1

它必须是这个语句开始的块内的东西:

if (user != null && user.getId() == 155)

这在逻辑上与方法 3 相同。当 JVM 看到它user为空时,它应该停止评估它。

我会说我在 JVM 1.3 中遇到过类似的情况,所以如果您使用的是非常旧的 JVM,可能就是这样。

于 2013-10-23T14:04:05.673 回答