2014年3月20日

インスタンスのキャッシュ

instance クラス(インスタンスを生成して使うクラス)でも、static なものとして欲しい場合がある。
例えば、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 件のコメント:

コメントを投稿