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