コンストラクタなしでオブジェクトが正しく初期化されていることを確認するにはどうすればよいですか?

ed22

次のような大量のパラメーターを使用してコンストラクターを作成する必要があります。

new MyClass(param1, param2, param3, ..., param100);

次のように、そのようなオブジェクトを段階的に初期化する方法はありますか?

MyClass obj = new MyClass();
obj.Prop1 = val1;
obj.Prop2 = val2;

obj.checkIfInit() //I am not sure how to do that.

クレイジーコンストラクターが使用されていない場合、正しく初期化されていることを確認するにはどうすればよいですか?

マシューワトソン

他の人が指摘しているように、実際にはそれほど多くのパラメーターを持つコンストラクターは必要ありません-データモデル型クラスの依存性注入では、多くの場合、多くのパラメーターが必要になります。その場合、通常は、パラメーターを独自のクラスにカプセル化されたサブセットにグループ化するのが最善です。

そのアドバイスにもかかわらず、「ビルダーパターン」の変種で問題に対処することができます

たとえば、次のようになります。

public sealed class MyClass
{
    public MyClass(int prop1, string prop2, DateTime prop3)
    {
        Prop1 = prop1;
        Prop2 = prop2;
        Prop3 = prop3;
    }

    public int      Prop1 { get; }
    public string   Prop2 { get; }
    public DateTime Prop3 { get; }
}

最初に、デフォルトのコンストラクターがなく、プロパティがすべて読み取り専用であるため、このクラスが不変になることに注意してください(多くの場合、良い考えです)。

(簡潔にするためにパラメーターチェックを省略しました。)

これで、オブジェクトを構築するためのヘルパークラスを作成できます。

public sealed class MyClassBuilder
{
    public MyClass Build()
    {
        if (!_prop1Set || !_prop2Set || !_prop3Set)
            throw new InvalidOperationException("Not all properties set.");

        return new MyClass(_prop1, _prop2, _prop3);
    }

    public MyClassBuilder Prop1(int value)
    {
        _prop1    = value;
        _prop1Set = true;

        return this;
    }

    public MyClassBuilder Prop2(string value)
    {
        _prop2    = value;
        _prop2Set = true;

        return this;
    }

    public MyClassBuilder Prop3(DateTime value)
    {
        _prop3    = value;
        _prop3Set = true;

        return this;
    }

    int      _prop1;
    string   _prop2;
    DateTime _prop3;

    bool _prop1Set;
    bool _prop2Set;
    bool _prop3Set;
}

プロパティを設定するための各メソッドはthis、次のように流暢に使用できるように、を返します

var builder = new MyClassBuilder();

builder
   .Prop1(1)
   .Prop2("test")
   .Prop3(DateTime.Now);

var myClass = builder.Build(); // Throws if not all properties set.

これにより、パラメーターの検証に大きな柔軟性がもたらされ、一部のパラメーターを省略できるようになります(適切なデフォルトを提供することにより)。

ビルダークラスの実際の例は、AutofacのContainerBuilderクラスであり、その使用法についてはここで説明します

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

pytestを使用してオブジェクトが正しく作成されたことを確認するにはどうすればよいですか?

分類Dev

3つのオブジェクトを変換して位置を入れ替えるにはどうすればよいですか?ただし、オブジェクトがすでに移動している位置にオブジェクトが移動していないことを確認してください。

分類Dev

クラスタイプのオブジェクトを初期化しないようにし、ポインターを使用せずにこれが当てはまる場合を識別するにはどうすればよいですか?

分類Dev

共有オブジェクト/共有ライブラリが正しくコンパイルされていることをテストするにはどうすればよいですか?

分類Dev

オブジェクトのタイプがこれと等しいことをC#で確認するにはどうすればよいですか?

分類Dev

MoshiでネストされたJSONオブジェクトではなく、文字列化されたJSONとしてオブジェクトのフィールドをエンコードするにはどうすればよいですか?

分類Dev

それらを直接参照すると未定義として表示されるが、コンソールロギング時に正しく表示されるオブジェクトキーにアクセスするにはどうすればよいですか?

分類Dev

子メソッドが親オブジェクトではなく子をインスタンス化することを確認するにはどうすればよいですか?

分類Dev

ArrayList の toString を返す/実装するにはどうすればよいですか? また、オブジェクトが正しく作成されたことを確認したいだけですか?

分類Dev

オブジェクトを関数に渡すときに、テンプレート化されたコンストラクターがクラスをパラメーターとして受け取らないようにするにはどうすればよいですか?

分類Dev

Pharo Smalltalk-メッセージが別のオブジェクトのクラスで定義されたプロトコルに準拠しているかどうかを確認するにはどうすればよいですか?

分類Dev

コピーなしで、ベクトル内のnoexceptmoveコンストラクターなしでオブジェクトを使用する。実際に何が壊れているのか、どうすれば確認できますか?

分類Dev

コンストラクターが初期化されている場合、オブジェクトの配列を初期化するにはどうすればよいですか?C ++

分類Dev

DataGridViewCheckBoxColumnの初期値を指定し、オブジェクトのインスタンスに設定されていないエラーオブジェクト参照を修正するにはどうすればよいですか?

分類Dev

オブジェクトが別のオブジェクトのプロパティにプロパティとしてネストされているかどうかを確認するにはどうすればよいですか?

分類Dev

PyQt5がMacに正しくインストールされていることを確認するにはどうすればよいですか?

分類Dev

Sphinxが「オブジェクト」を基本クラスとしてリストしないようにするにはどうすればよいですか?

分類Dev

オブジェクトがラムダであることを正しく判断するにはどうすればよいですか?

分類Dev

JSONスキーマ:配列に、指定された値を持つプロパティを持つオブジェクトが少なくとも1つ含まれていることを確認するにはどうすればよいですか?

分類Dev

Jekyllが正しくインストールされていることを確認するにはどうすればよいですか?

分類Dev

クラスに別のクラスのオブジェクトが含まれていて、すべてのクラスがコンストラクターによって初期化される場合、初期化はどのように機能しますか?

分類Dev

コンストラクターでC ++オブジェクトメンバー変数を初期化するにはどうすればよいですか?

分類Dev

Typescriptでオブジェクトまたは通常のパラメータコンストラクタを使用して初期化できるクラスを作成するにはどうすればよいですか?

分類Dev

タイプスクリプトエラー「x」に初期化子がなく、コンストラクターで明確に割り当てられていないことを解決するにはどうすればよいですか?

分類Dev

Juliaでプロジェクトマニフェストが完了していることを確認するにはどうすればよいですか?

分類Dev

クラスのサイズがゼロなのはなぜですか?異なるオブジェクトが異なるアドレスを持っていることを確認するにはどうすればよいですか?

分類Dev

クラスのサイズがゼロなのはなぜですか?異なるオブジェクトが異なるアドレスを持っていることを確認するにはどうすればよいですか?

分類Dev

プロジェクトで最新のJavaライブラリを使用していることを確認するにはどうすればよいですか?

分類Dev

オブジェクトをコンストラクターとして使用するにはどうすればよいですか?

Related 関連記事

  1. 1

    pytestを使用してオブジェクトが正しく作成されたことを確認するにはどうすればよいですか?

  2. 2

    3つのオブジェクトを変換して位置を入れ替えるにはどうすればよいですか?ただし、オブジェクトがすでに移動している位置にオブジェクトが移動していないことを確認してください。

  3. 3

    クラスタイプのオブジェクトを初期化しないようにし、ポインターを使用せずにこれが当てはまる場合を識別するにはどうすればよいですか?

  4. 4

    共有オブジェクト/共有ライブラリが正しくコンパイルされていることをテストするにはどうすればよいですか?

  5. 5

    オブジェクトのタイプがこれと等しいことをC#で確認するにはどうすればよいですか?

  6. 6

    MoshiでネストされたJSONオブジェクトではなく、文字列化されたJSONとしてオブジェクトのフィールドをエンコードするにはどうすればよいですか?

  7. 7

    それらを直接参照すると未定義として表示されるが、コンソールロギング時に正しく表示されるオブジェクトキーにアクセスするにはどうすればよいですか?

  8. 8

    子メソッドが親オブジェクトではなく子をインスタンス化することを確認するにはどうすればよいですか?

  9. 9

    ArrayList の toString を返す/実装するにはどうすればよいですか? また、オブジェクトが正しく作成されたことを確認したいだけですか?

  10. 10

    オブジェクトを関数に渡すときに、テンプレート化されたコンストラクターがクラスをパラメーターとして受け取らないようにするにはどうすればよいですか?

  11. 11

    Pharo Smalltalk-メッセージが別のオブジェクトのクラスで定義されたプロトコルに準拠しているかどうかを確認するにはどうすればよいですか?

  12. 12

    コピーなしで、ベクトル内のnoexceptmoveコンストラクターなしでオブジェクトを使用する。実際に何が壊れているのか、どうすれば確認できますか?

  13. 13

    コンストラクターが初期化されている場合、オブジェクトの配列を初期化するにはどうすればよいですか?C ++

  14. 14

    DataGridViewCheckBoxColumnの初期値を指定し、オブジェクトのインスタンスに設定されていないエラーオブジェクト参照を修正するにはどうすればよいですか?

  15. 15

    オブジェクトが別のオブジェクトのプロパティにプロパティとしてネストされているかどうかを確認するにはどうすればよいですか?

  16. 16

    PyQt5がMacに正しくインストールされていることを確認するにはどうすればよいですか?

  17. 17

    Sphinxが「オブジェクト」を基本クラスとしてリストしないようにするにはどうすればよいですか?

  18. 18

    オブジェクトがラムダであることを正しく判断するにはどうすればよいですか?

  19. 19

    JSONスキーマ:配列に、指定された値を持つプロパティを持つオブジェクトが少なくとも1つ含まれていることを確認するにはどうすればよいですか?

  20. 20

    Jekyllが正しくインストールされていることを確認するにはどうすればよいですか?

  21. 21

    クラスに別のクラスのオブジェクトが含まれていて、すべてのクラスがコンストラクターによって初期化される場合、初期化はどのように機能しますか?

  22. 22

    コンストラクターでC ++オブジェクトメンバー変数を初期化するにはどうすればよいですか?

  23. 23

    Typescriptでオブジェクトまたは通常のパラメータコンストラクタを使用して初期化できるクラスを作成するにはどうすればよいですか?

  24. 24

    タイプスクリプトエラー「x」に初期化子がなく、コンストラクターで明確に割り当てられていないことを解決するにはどうすればよいですか?

  25. 25

    Juliaでプロジェクトマニフェストが完了していることを確認するにはどうすればよいですか?

  26. 26

    クラスのサイズがゼロなのはなぜですか?異なるオブジェクトが異なるアドレスを持っていることを確認するにはどうすればよいですか?

  27. 27

    クラスのサイズがゼロなのはなぜですか?異なるオブジェクトが異なるアドレスを持っていることを確認するにはどうすればよいですか?

  28. 28

    プロジェクトで最新のJavaライブラリを使用していることを確認するにはどうすればよいですか?

  29. 29

    オブジェクトをコンストラクターとして使用するにはどうすればよいですか?

ホットタグ

アーカイブ