无论如何我可以拦截一个新电话吗?
Is there anyway I can intercept a new call?
我有一个我想要缓存的类型,因为它是不可变的,如果你调用 new Foo(1)
,它会创建它,但也会将该实例添加到缓存中,如果你这样做同样,您最终会得到值为 1.
的缓存 Foo
不知何故,这意味着我需要拦截调用 new <Type>()
,而是使用自定义逻辑。
这是否可能,如果可能,其性能如何?
执行此操作的标准方法是使用工厂模式和私有构造函数。私有构造函数意味着 class 之外的任何代码都不能使用 new Foo(1)
,但是您将编写类似 Foo.newFoo(1);
的代码,它将包含创建新的 Foo
或return 一个缓存值。
您将不得不修改已编译的 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)
{
}
}
注意构造函数是私有的。获取此 class 实例的唯一方法是使用工厂方法。
我有一个我想要缓存的类型,因为它是不可变的,如果你调用 new Foo(1)
,它会创建它,但也会将该实例添加到缓存中,如果你这样做同样,您最终会得到值为 1.
Foo
不知何故,这意味着我需要拦截调用 new <Type>()
,而是使用自定义逻辑。
这是否可能,如果可能,其性能如何?
执行此操作的标准方法是使用工厂模式和私有构造函数。私有构造函数意味着 class 之外的任何代码都不能使用 new Foo(1)
,但是您将编写类似 Foo.newFoo(1);
的代码,它将包含创建新的 Foo
或return 一个缓存值。
您将不得不修改已编译的 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)
{
}
}
注意构造函数是私有的。获取此 class 实例的唯一方法是使用工厂方法。