web-dev-qa-db-ja.com

固定タイムアウト内で単一のオブジェクトをキャッシュする最良の方法は何ですか?

Google GuavaにはCacheBuilderがあり、固定Tiemoutの後にエントリを削除できる期限切れキーでConcurrentHashを作成できます。ただし、特定のタイプのインスタンスを1つだけキャッシュする必要があります。

Google Guavaを使用して、一定のタイムアウト内で単一のオブジェクトをキャッシュする最良の方法は何ですか?

57
Alexey Zakharov

Guavaの Suppliers.memoizeWithExpiration(Supplier delegate、long duration、TimeUnit unit) を使用します

public class JdkVersionService {

    @Inject
    private JdkVersionWebService jdkVersionWebService;

    // No need to check too often. Once a year will be good :) 
    private final Supplier<JdkVersion> latestJdkVersionCache
            = Suppliers.memoizeWithExpiration(jdkVersionSupplier(), 365, TimeUnit.DAYS);


    public JdkVersion getLatestJdkVersion() {
        return latestJdkVersionCache.get();
    }

    private Supplier<JdkVersion> jdkVersionSupplier() {
        return new Supplier<JdkVersion>() {
            public JdkVersion get() {
                return jdkVersionWebService.checkLatestJdkVersion();
            }
        };
    }
}

JDK 8で更新

今日は、JDK 8メソッド参照とコンストラクタインジェクションを使用して、よりクリーンなコードでこのコードを別の方法で記述します。

import Java.util.concurrent.TimeUnit;
import Java.util.function.Supplier;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.google.common.base.Suppliers;

@Service
public class JdkVersionService {

    private final Supplier<JdkVersion> latestJdkVersionCache;

    @Inject
    public JdkVersionService(JdkVersionWebService jdkVersionWebService) {
        this.latestJdkVersionCache = Suppliers.memoizeWithExpiration(
                jdkVersionWebService::checkLatestJdkVersion,
                365, TimeUnit.DAYS
        );
    }

    public JdkVersion getLatestJdkVersion() {
        return latestJdkVersionCache.get();
    }
}
103
Etienne Neveu