かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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からさがしていくみたいだ。