かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ProxyLookupって何?

ProxyLookupというものがある。
どうやら2つ以上のLookupをくっつけてくれるものみたいです。

擬似的なコードだとこんな感じ。

Lookup foo = どうにかして取得1();
Lookup bar = どうにかして取得2();

Lookup proxy = new ProxyLookup(foo, bar); //合体!

// fooとbarの両方から探してくれる
なんかのクラス a = proxy.lookup(なんかのクラス.class);


ついでに、自分でお手軽にLookupを作るには「org.openide.util.lookup.Lookups」クラスにあるstaticメソッドを使うとできる。
たとえば下のように。

package okazuki.lookup;

import java.util.Collection;
import org.openide.util.Lookup;
import org.openide.util.lookup.Lookups;

public class ProxyLookupMain {
    public static void main(String[] args) {
        // 1つだけ
        Lookup one = Lookups.singleton("one");
        // いっぱい
        Lookup foo = Lookups.fixed("いっぱい", "登録", "できるっぽい");
        
        printAll(one.lookupAll(String.class));
        printAll(foo.lookupAll(String.class));
    }
    
    private static void printAll(Collection<? extends String> strings) {
        System.out.println("==============================");
        for (String str : strings) { System.out.println(str); }
    }
}

実行すると下のようになる。

==============================
one
==============================
いっぱい
登録
できるっぽい

この2つのLookupをProxyで繋げて見る。
コードはこんな感じ。Proxyで繋げてlookupしている。

package okazuki.lookup;

import java.util.Collection;
import org.openide.util.Lookup;
import org.openide.util.lookup.Lookups;
import org.openide.util.lookup.ProxyLookup;

public class ProxyLookupMain {
    public static void main(String[] args) {
        Lookup one = Lookups.singleton("one");
        Lookup foo = Lookups.fixed("いっぱい", "登録", "できるっぽい");
        
        // Proxyでがっちゃんこ
        Lookup proxy = new ProxyLookup(one, foo);
        
        printAll(proxy.lookupAll(String.class));
    }
    
    private static void printAll(Collection<? extends String> strings) {
        System.out.println("==============================");
        for (String str : strings) { System.out.println(str); }
    }
}

実行結果はこうなる。

==============================
one
いっぱい
登録
できるっぽい

ちなみにProxyを作ってる部分を

new ProxyLookup(one, foo);

から

new ProxyLookup(foo, one); // 入れ替えた!!

にすると実行結果は下のようになる。

==============================
いっぱい
登録
できるっぽい
one

出力が逆になったね。
どうやらProxyLookupは、引数に渡した順番にLookupからさがしていくみたいだ。