《余録》Swing/Jython - Adapter の隘路

Java プログラマーのための Python 導入ガイド記事一覧
《余録》Adapter の隘路

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03

》作業中です《

■ 概要

フォルダー/ファイルの階層構造を Swing/GUI を利用して「簡単に」閲覧できるツールがあると便利です。

 セミナー課題では、JTree/DefaultMutableTreeNode と同等の機能を「実現する」方法を紹介しました。
 ここでは、入門者向けに、既存の機能を「利用する」方法を紹介するとともに、その問題点について考察します。

 《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。
■ 関連記事
参考文献 note
JavaプログラマのためのUML活用ガイド―例題に学ぶオブジェクト指向プログラミング設計

JavaプログラマのためのUML活用ガイド―例題に学ぶオブジェクト指向プログラミング設計

Adapter を導入するときに「継承」と「委譲」とで実現したものを比較しています。

継承:Adapter

GoF〉Adapter パターンを導入すると、Java で実現されたクラス群を、Python の組み込み型と同様に扱えるようになります。

from java.util import Vector

class xlist(Vector):
    def __getattribute__(self, name):
        dirs = {
            "append"     : "addElement"   ,
            "remove"     : "removeElement",
            "__getitem__": "elementAt"    ,
        }
        name = dirs.get(name)
        if not name:
            raise AttributeError
        return Vector.__getattribute__(self, name)

クラス xlist は、java.util.Vector を継承したものですが、組み込み型 list に適用できるメソッド append/remove だけが有効です。

def ex(*args):
    s = xlist()     ;print len(s),s
    s.append("A")   ;print len(s),s
    s.append("B")   ;print len(s),s
    s.remove("B")   ;print len(s),s

>>> ex()
0 []
1 [A]
2 [A, B]
1 [A]

>>> for i in range(3):
... 	print i, s[i]   
... 
0 A
1 B
2 C

すると、Vector を list として扱えるようになります。また、演算子 [] を利用して、各要素を参照できます。

def ex2():
    s = Vector()           ;print len(s),s
    s.addElement("A")      ;print len(s),s
    s.addElement("B")      ;print len(s),s
    s.removeElement("B")   ;print len(s),s

>>> ex2()
0 []
1 [A]
2 [A, B]
1 [A]
>>> s = xlist(list("ABC"))
>>> s
[A, B, C]
>>> for e in s: print e
... 
A
B
C
>>> reduce(lambda s,e: e+s, s, "")
u'CBA'
>>> "A" in s
True
>>> [ord(e) for e in s]
[65, 66, 67]
>>> dict((e,ord(e)) for e in s)
{u'C': 67, u'B': 66, u'A': 65}

(組み込み型 list と同様に)xlist にも、組み込み関数、演算子だけでなく、リスト/辞書の内包、ジェネレーター式なども有効です。

Tips

》作業中です《

Last updated♪09/05/20