0

効果的な Java を読むと、メソッド パラメーターを有効な方法として検証し、パブリック メソッドに対して例外をスローし、プライベート メソッドに対してアサートする必要があることが言及されています。しかし、インスタンス変数に対して何らかの対策を講じる必要がありますか。

EG: (ユースケースとして例をとらないでください。主な質問はDo I need to validate instance var or Not ?.

class Tree {

   private Node root;

   public doSomething() {
      TreeNode node = root;
   }
}

ここで、root初期化されずdoSomething()に直接呼び出されたとしましょう。NullPtrException が発生します。

Do we need to guard against it ? If yes then how ? If no then why not ?

4

3 に答える 3

1

どうですか:

if (root == null) {
    throw new SomethingException();
}
TreeNode node = root;

簡単に言えば、ルート変数に対して null チェックを実行し、それが null の場合は、それに応じてコードを実行して、その問題を修正するか、新しい例外をスローします。

于 2013-09-26T17:51:10.453 に答える
0

メソッド パラメータをチェックするための確立された方法は、クラスの正しい使用法をチェックするために一般化できます。doSomething()与えられた例では、インスタンス変数rootがまだ初期化されていないときにメソッドを呼び出すことは違法です。

ベスト プラクティス ルールが必要な場合は、インスタンス変数を一般的にチェックするのではなく、クラスの特定の使用プロトコルに従っていることをチェックします。(特定のプロトコルに従う必要がない方法でクラスが作成されている場合を除き、通常はこれがより適切なオプションです。)もちろん、このチェックには通常、インスタンス変数のチェックが含まれます。

否定的なメソッド パラメータ チェックの後に をスローするのとは対照的にIllegalArgumentException、プロトコル違反はIllegalStateException.

この例でIllegalStateExceptionは、インスタンスが呼び出される可能性のある状態ではないため、 をスローする必要がありdoSomething()ます。

于 2013-09-26T19:52:43.827 に答える
0

インスタンス変数の検証コードをコンストラクターとセッターに移動して、設定または変更されるたびにチェックし、変更が行われる前に入力が無効な場合は例外をスローします。

これにより、完全に構築されたオブジェクトのインスタンス変数が常に有効な状態に保たれるため、他の場所に余分な検証を振りかける必要がなくなります。

于 2013-09-26T17:58:10.970 に答える