1

I have the following code in the mClass constructor:

public mClass(Context ctx) {
    super();
    this.ctx = ctx;
}

The context can't be null because its necesary for the object operation. So if I allow the creation of an new mClass(null) it will break later.

I'd like to crash when the object is create because is when the incorrect situation is happening. Whats the standard way of doing this?

For example making

public mClass(Context ctx) {
    super();
    if(ctx==null) throw new Exception ("....");
    this.ctx = ctx;
}

forces to declare the method as exception thrower and I dont wan't to do this because passing a null value is not usual

4

3 に答える 3

7

投げるjava.lang.IllegalArgumentException

これは実行時の例外であるため、これを強制的に処理する必要はありません。スローされると、アプリケーションがクラッシュします(処理されない場合)。

于 2012-07-10T10:02:30.703 に答える
1

クラスのコンストラクターをプライベートにすることで、コンストラクターからの例外のスローを回避できます。これにより、クライアントがビルダーを介してのみクラスのインスタンスを作成できるようになります。ビルダーは、以下に示すように、オブジェクトを作成する前に、提供されたコンストラクターの依存関係の有効性を確認できます。

public class MyClass {

    public static class MyClassBuilder {
        private Context ctx;

        public MyClassBuilder setContext(Context ctx) {
            this.ctx = ctx;

            return this;
        }

        public MyClass build() {
            if(ctx==null) {
                throw new IllegalArgumentException ("");
            } else {
                return new MyClass(this.ctx);
            }
        }
    }

    private final Context ctx;

    private MyClass(Context ctx) {
        super();
        this.ctx = ctx;
    }
}
于 2012-07-10T10:16:40.393 に答える
1

MyClass独自の構築に責任を負わない場合は、自分Contextと同じように注入する必要があります。aRuntimeExceptionまたは任意のサブクラスをスローするとnullチェックが可能になりますが、IllegalArgumentExceptionここで最も適切です。

ctxフィールドをfinalにすることを忘れないでください。これにより、コードがより堅牢になります。

于 2012-07-10T10:35:43.703 に答える