groovy789's blog

技術系備忘録φ(..)メモメモ

Javaでデータキャッシュ

Javaで固定サイズのキャッシュを作るサンプル。

public class Main {
    /**
     * キャッシュ
     */
    private Map<Integer, String> cache = new LinkedHashMap<Integer, String>(){
        @Override
        protected boolean removeEldestEntry(Map.Entry<Integer, String> eldest) {
            // 30件までキャッシュ
            return size() > 10;
        }
    };
    
    /**
     * テスト
     */
    private void some() {
        // データを30件設定
        for (int i=0; i< 10; i++) {
            cache.put(i, String.valueOf(i));
        }
        System.out.println(cache);    //{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
        cache.put(10, "10");
        System.out.println(cache);    //{1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10}
    }
    
    public static void main(String[] args) {
        new Main().some();
    }
}

GroovyのOwner、this、delegateについて

[groovy]いまいち使い方がわからなかったので、テストコードで試してみた。

/**
 * クロージャの実行順序確認
 */
class Sample1 {        
    static main(args) {
        // クラスBのインスタンス作成
        def b = new B()
        // クラスAのクロージャを設定
        b.c = new A().c
        def bb = b.c()
        // デリゲート設定
        bb.delegate = b
        // クロージャ実行
        bb()
    }
    
    static class A {
        // クロージャを返すクロージャ
        def c = {
            def hello = {
                println "Hello A1'"
            }
            return {
                println owner
                println "this    =$this"
                println "delegate=$delegate"
                hello()
            }
        }
        
       def hello() {
           println "Hello A1"
       } 
    }
    
    static class B {
      // クロージャ
       def c 
        
        def hello() {
            println "Hello B1"
        }
    }
}


実行すると、「"Hello A1'"」が表示される。

メソッドの探索順はowner⇒this⇒delegateの順

すっきり~