1. ホーム
  2. java

[解決済み] Java コンストラクタのスタイル: パラメータが NULL でないことを確認する

2023-08-18 05:13:22

質問

いくつかのパラメータを受け取るクラスがある場合、ベストプラクティスは何でしょうか? null ?

以下は当たり前ですが、例外が少し不特定多数になります。

public class SomeClass
{
     public SomeClass(Object one, Object two)
     {
        if (one == null || two == null)
        {
            throw new IllegalArgumentException("Parameters can't be null");
        }
        //...
     }
}

ここでは、例外によってどのパラメータがnullであるかがわかりますが、コンストラクタはかなり醜いものになっています。

public class SomeClass
{
     public SomeClass(Object one, Object two)
     {
        if (one == null)
        {
            throw new IllegalArgumentException("one can't be null");
        }           
        if (two == null)
        {
            throw new IllegalArgumentException("two can't be null");
        }
        //...
  }

ここではコンストラクタはよりすっきりしていますが、今度はコンストラクタのコードは実際にはコンストラクタの中にありません。

public class SomeClass
{
     public SomeClass(Object one, Object two)
     {
        setOne(one);
        setTwo(two);
     }


     public void setOne(Object one)
     {
        if (one == null)
        {
            throw new IllegalArgumentException("one can't be null");
        }           
        //...
     }

     public void setTwo(Object two)
     {
        if (two == null)
        {
            throw new IllegalArgumentException("two can't be null");
        }
        //...
     }
  }

どのスタイルが一番良いですか?

あるいは、もっと広く受け入れられている代替案があるのでしょうか?

どのように解決するのですか?

2番目か3番目です。

なぜなら、それはあなたのAPIのユーザーに、何が正確に間違っていたのかを伝えるからです。

より冗長性を減らすには Validate.notNull(obj, message) を使います。このように、あなたのコンストラクタは次のようになります。

public SomeClass(Object one, Object two) {
    Validate.notNull(one, "one can't be null");
    Validate.notNull(two, "two can't be null");
    ...
}

セッターにチェックを入れることも可能で、同じ冗長性コメントが付きます。セッターがオブジェクトの一貫性を保持する役割も持っている場合、3番目も選択できます。