Cache のクリア

以前に紹介した汎用オブジェクトCache [id:gakuzo:20090226:1235667999] ですが、キャッシュのクリアが無いと使えないよ!というご指摘を受けました。

キャッシュのクリアについては、Cacheインスタンス自体を破棄すれば OK です。

例としてはこんな感じに。

public class CachingEmployeeFinder  implements EmployeeFinder {
    
    private EmployeeFinder originalFinder;
    private Callable<List<Employee>> factory = new Callable<List<Employee>>() {
        public List<Employee> call() {
            return originalFinder.findAll();
        }
    };
    private volatile Cache<List<Employee>> cache = new Cache<List<Employee>>(factory);

    public List<Employee> findAll() {
        List<Employee> original = cache.get();
        List<Employee> result = new ArrayList<Employee>(original.size());
        for (Employee employee : original) {
            result.add(employee.clone());
        }
        return result;
    }
    
    public void setOriginalFinder(EmployeeFinder originalFinder) {
        this.originalFinder = originalFinder;
    }

    public void clearCache() {
        cache = new Cache<List<Employee>>(factory);
    }

}

キャッシュクリアするのに並列性に気を使わないでバグを混入するのも、クリア時の安全性に気を使いすぎて同期化コストでキャッシュを導入する前より重くなるのも、もう勘弁してください><