存在哪些工具/库将采用结构并自动生成不可变的包装器以及用于增量构建新实例的“构建器”类?
示例输入:
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()
和GetHashCode()
任何接口方法) - 还为每个结构成员生成一个
IFooReader
包含只读属性的接口,由不可变和构建器实现。 - 如果字段的类具有不可变等效项,则在不可变类中使用不可变版本(另请参阅如何在 C# 中为具有引用类型属性的对象创建构建器?)例如
List
->ReadOnlyCollection
或类似的。 - 或者将构建器类作为输入(构建器使用自动属性而不是委托给结构。)
- 不需要
Clone
预定义方法
“你不应该使用这样的工具,因为......”也欢迎回答。