我有一个我想要缓存的类型,因为它是不可变的,如果你调用new Foo(1)
,它会创建它但是也会将该实例添加到缓存中,如果你再做一次,您最终会得到值为1的缓存Foo
。
这意味着我需要拦截调用new <Type>()
,而是使用自定义逻辑。
这是否可能,如果可行,它的表现如何?
答案 0 :(得分:5)
您必须修改已编译的IL。它很难实现和不可读。任何看到new
的人都希望创建一个新实例。
更好地使用静态工厂方法:
public class Foo
{
public static Foo GetInstance(int parameter)
{
if (FooCache.IsCached(parameter))
{
// return instance from cache
}
else
{
Foo instance = new Foo(parameter);
// add to cache
return instance;
}
}
private Foo(int parameter)
{
}
}
请注意,构造函数是私有的。获取此类实例的唯一方法是使用工厂方法。
答案 1 :(得分:0)
执行此操作的标准方法是使用Factory Pattern和私有构造函数。私有构造函数意味着类之外的代码不能使用new Foo(1)
,而是会编写类似Foo.newFoo(1);
的内容,它将保留逻辑以创建新的Foo
或返回缓存的值