《余録》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活用ガイド―例題に学ぶオブジェクト指向プログラミング設計
|
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