構造体を取り、不変のラッパーと、新しいインスタンスを段階的に構築するための「ビルダー」クラスを自動的に生成するツール/ライブラリは何ですか?
入力例:
struct Foo
{
public int apples;
public int oranges;
public Foo Clone() {return (Foo) base.MemberwiseClone();}
}
出力例:
public class ImmutableFoo // could probably be a struct
{
private Foo snapshot;
internal ImmutableFoo(Foo value) { this.snapshot = value; }
public FooBuilder Builder() { return new FooBuilder(snapshot); }
public int Apples { get { return snapshot.apples; } }
public int Oranges { get { return snapshot.oranges; } }
}
public class FooBuilder
{
private Foo state;
public int Apples { get { return state.apples; } set { state.apples = value; } }
public int Oranges { get { return state.oranges; } set { state.oranges = value; } }
public FooBuilder() { }
internal FooBuilder(Foo toCopy) { state = toCopy.Clone(); }
public ImmutableFoo Build()
{
ImmutableFoo result = new ImmutableFoo(state);
state = state.Clone();
return result;
}
}
このような「ツール」は、IDE プラグインであるか、リフレクションを使用して実行時に新しいクラスを生成することができます。
例は C# ですが、静的に型付けされた OO 言語 (Java、Scala、C++ など) のソリューションに興味があります。
望ましい機能:
- ビルダー クラスの構造体からメソッドを再作成します。
- 不変クラスの構造体から非破壊的なメソッドを再作成します (特に
Equals()
andGetHashCode()
およびインターフェイス メソッド) 。 IFooReader
また、不変とビルダーの両方によって実装される、各構造体メンバーの読み取り専用プロパティを含むインターフェイスを生成します。- フィールドのクラスに不変の同等物がある場合、不変のクラスで不変のバージョンを使用します (参照型であるプロパティを持つオブジェクトの C# でビルダーを作成する方法も参照してください)。eg
List
->ReadOnlyCollection
など。 - または、ビルダー クラスを入力として使用します (ビルダーは、構造体に委譲する代わりに自動プロパティを使用します)。
Clone
メソッドを事前定義する必要はありません
「このようなツールは使用しないでください...」という回答も大歓迎です。