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

ここでnull オブジェクト パターンを使用しないのはなぜですか? user を null に設定する代わりに、オブジェクトの特別な「null」ケース (実装) に設定しUserます。

例えば

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

(理想的には、AnotherClass.getUser() は内部的に null チェックを行います)

この場合

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が null であることを確認すると、その評価を停止する必要があります。

私はJVM 1.3でこのようなことに遭遇したと言います.

于 2013-10-23T14:04:05.673 に答える