1

これがデモです、

public class MyClass {
    public MyClass(String str) {
        if (null == str)
            return;

        mStr = processInput(str);
        mMember1 = initMember1();
        // ... some other initialization
}

上記のようなもの、それは良いですか悪いですか?
それが戻った場合、正しい初期化なしで構築されたオブジェクトを取得する可能性があります。

4

5 に答える 5

3

場合によります。

クラスがnullコンストラクターに渡され、初期化をバイパスして適切に動作できる場合は、問題ありません。

クラスができない場合は、例外をスローします。チェックされた例外でない場合は、通常はIllegalArgumentException


このコンストラクターは、次と同等の便利なコンストラクターのように見えます。

MyClass o = new MyClass();
o.doSomethingWithString(str);

もしそうなら、より良いアプローチは、メソッドが戻る(可能な場合)流暢なインターフェースthisパターンを使用することであるかもしれません、それであなたはコーディングすることができます:

MyClass o = new MyClass().doSomethingWithString(str);

ここで、メソッドdoSomethingWithString()はとして宣言される代わりにvoid、の戻り型をMyClass持ち、最後の行は。になりますreturn this;。このパターンは、メソッドへの呼び出しを連鎖させるのに便利ですo.doX().setY(y).doZ();

于 2012-12-17T05:32:14.547 に答える
2

これは良いかもしれません。

public class MyClass {
    public MyClass(String str) {
        if (null == str){
            throw new YourException("Your message");
        }
        mStr = processInput(str);
        mMember1 = initMember1();
        // ... some other initialization
}

IMO、コンストラクターから戻るのは悪い習慣です。:)

于 2012-12-17T05:43:23.823 に答える
1

コンストラクターがオブジェクトを有用な状態に置くことができない場合、可能な限り最も防弾の契約は、コンストラクターが例外をスローすることです。

呼び出し元が内部エラーフラグをチェックすると想定するのは危険です。

例外の発生を延期すると、実際の障害点から障害認識点が削除されるだけであり、根本原因を特定することがより困難になります。

于 2012-12-17T05:30:31.903 に答える
1

コンストラクターから戻ると、オブジェクトは作成されますが、戻った後に残りのコードは初期化されません。クラスが適切に動作できる場合は、問題ありません。残りを初期化することが重要であるが、それができない場合は、送信者が何かがうまくいかなかったことを知るために例外をスローします。

于 2012-12-17T05:33:57.973 に答える
0

最初に行う必要があるのは、そのクラスにマークを付けることfinalです。次に、部分オブジェクトの処理を続行できます。実行したいのは、SecurityExceptionまたはのようなものをスローすることIllegalStateExceptionです。SecurityException悪意のある誰かがその部分的なオブジェクトを取得して悪いことをする可能性があることを示しているので、私は一般的にに傾いています。を使用するfinalと、誰かが部分的なオブジェクトを拡張してシステムでamokを実行するのを防ぐのに役立ちます。

于 2012-12-17T17:36:17.860 に答える