instance クラス(インスタンスを生成して使うクラス)でも、static なものとして欲しい場合がある。
例えば、IComparer<T> や IEqualityComparer<T> を実装したクラスのインスタンスは、基本的に 1 個あれば十分である。
このようなクラスについては、自身のインスタンスを保持する static プロパティ(またはメンバ)を公開する方法がある。
しかし、クラス毎に変数を用意するのは面倒。かつ、重複コードなのであまり美しくない。
そこで、generic type caching を使う方法を考えてみた。
呼び出し側が長くなるデメリットがあるが、クラス毎に変数を用意する必要がなくなってスッキリ?する。
例えば、IComparer<T> や IEqualityComparer<T> を実装したクラスのインスタンスは、基本的に 1 個あれば十分である。
このようなクラスについては、自身のインスタンスを保持する static プロパティ(またはメンバ)を公開する方法がある。
public class OreOreComparer : IComparer<OreClass>
{
public static Default { get { return _default; } }
private static readonly _default = new OreOreComparer();
public int Compare(OreClass x, OreClass y) { /* 実装 */ }
}
// または
public class OreOreComparer : IComparer<OreClass>
{
public static readonly Default = new OreOreComparer();
public int Compare(OreClass x, OreClass y) { /* 実装 */ }
}
しかし、クラス毎に変数を用意するのは面倒。かつ、重複コードなのであまり美しくない。
そこで、generic type caching を使う方法を考えてみた。
呼び出し側が長くなるデメリットがあるが、クラス毎に変数を用意する必要がなくなってスッキリ?する。
// 値型をキャッシュしたくない場合は class 制約もあり
public static class InstanceCache<T> where T : new()
{
public static readonly T Default = new T();
}
// 使い方 : OreClass のインスタンス OreA と OreB を比較する
var comparer = InstanceCache<OreOreComparer>.Default;
var result = comparer.Compare(OreA, OreB);
0 件のコメント:
コメントを投稿