SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

よろずプログラマーのためのPython導入ガイド

Java meets Python - 第1回 JavaBeansの美味しい煎り方

よろずプログラマーのためのPython導入ガイド (3)

JavaBeans:添字演算子

 インスタンス変数が配列として宣言されていると、Jythonを介して、添字演算子[]を適用できます。

public class ColorBeans {
    private String[] colors;
    public ColorBeans() {
        this.colors = new String[] {"Red", "Green", "Blue"};
    }
    public String[] getColor() {
        return this.colors;
    }
    public void setColor(String[] colors) {
        this.colors = colors;
    }
}

 Javaで記述したクラスColorBeansには、String[]型の特性colorsを定義しています。これは、String型の要素を列挙した配列です。これには、獲得/設定メソッドgetColor/setColorが定義されます。

C#におけるプロパティ
 ここで、注意して欲しいのは、変数の名前がcolorではなくcolorsとなっていることです。つまり、C#におけるプロパティと同様に、メソッドと変数の名前を一致させる必要はありません。これは、要求仕様の変更に伴う作業の処方箋として重宝され、変更容易性と連続性に優れた、agile言語には欠かせない特徴の一つです。連続性に関する広範な論議は、プログラミング言語Eiffelなどを参照してください。
>>> import ColorBeans

 importを利用すると、クラスファイルColorBeans.classで定義された情報に、Jythonからアクセスできます。

>>> dir(ColorBeans)
['color', 'getColor', 'setColor']

 組み込み関数dirを使って、クラスColorBeansに固有の情報を調べると、メソッドgetColor/setColorが定義されているのが分かります。

>>> dir(ColorBeans())
['__init__', 'class', 'color', 'equals', 'getClass', 'getColor',
 'hashCode', 'notify', 'notifyAll', 'setColor', 'toString', 'wait']

 クラスColorBeansのインスタンスに固有の情報を調べると、先と同様に、親クラスObjectから継承したメソッドgetClassなども含まれるのが分かります。

>>> properties(ColorBeans)
['class', 'color']

 先に示した方法を利用すると、クラスColorBeansに固有の特性colorのほかに、親クラスObjectで定義された特性classが得られます。

配列の各要素にアクセスする

>>> bean = ColorBeans()
>>> bean.color[1]
Green

 Jythonでは、Pythonのスタイルを併用できます。メソッドgetColorを使わなくても、属性名colorを使って値(配列)を獲得したり、添字演算子[]を使って、配列内の各要素にアクセスできます。

>>> for e in bean.color: print e
Red
Green
Blue

 また、for文を使って、配列内の各要素eにアクセスできます。すると、配列内の各要素が順に出力されるのが分かります。

>>> bean.color[1] = "Yellow"
>>> bean.color[1]
Yellow

 先と同様に、メソッドsetColorではなく、添字演算子[]と代入演算子=を使って、値を設定できます。すると、GreenからYellowへと変化したのが分かります。

JavaBeans:キーワード引数とタプル

 インスタンス変数が任意のクラスのインスタンスとして宣言されているなら、Jythonを介して、便利な機能を利用できます。

import java.awt.Dimension;
        
public class TupleBeans {
    private Dimension size;
    public TupleBeans() {
        this.size = new Dimension(0, 0);
    }
    public Dimension getSize() {
        return this.size;
    }
    public void setSize(Dimension d) {
        this.size = d;
    }    
}

 Javaで記述したクラスTupleBeansには、Dimension型の特性sizeを定義しています。これには、獲得/設定メソッドgetSize/setSizeが定義されます。

>>> import TupleBeans

 importを利用すると、クラスファイルTupleBeans.classで定義された情報に、Jythonからアクセスできます。

>>> dir(TupleBeans)
['getSize', 'setSize', 'size']

 組み込み関数dirを使って、クラスTupleBeansに固有の情報を調べると、メソッドgetSize/setSizeが定義されているのが分かります。

>>> dir(TupleBeans())
['__init__', 'class', 'equals', 'getClass', 'getSize', 'hashCode',
 'notify', 'notifyAll', 'setSize', 'size', 'toString', 'wait']

 クラスTupleBeansのインスタンスに固有の情報を調べると、先と同様に、親クラスObjectから継承したメソッドgetClassなども含まれるのが分かります。

>>> properties(TupleBeans)
['class', 'size']

 先に示した方法を利用すると、クラスTupleBeansに固有の特性sizeのほかに、親クラスObjectで定義された特性classが得られます。

JavaBeansの属性を初期設定する

>>> bean = TupleBeans(size=(200, 100))
>>> bean.size
java.awt.Dimension[width=200,height=100]

 Jythonでは、Pythonのスタイルを併用できます。キーワード引数size=を使うと、メソッド呼び出しsetSize()と同じ効果が得られます。ただし、この方法が有効なのは、コンストラクタ呼び出しの場合だけです。また、実引数にタプル200,100を指定すると、型情報を手掛かりに適切なDimension(200,100)を呼び出します。これは、メソッド呼び出しsetSize(Dimension(220,100))と等価です。

>>> bean = ColorBeans(color=["Black", "White"])
>>> bean.color
array(java.lang.String,['Black', 'White'])

 先の事例でも、キーワード引数color=の実引数にリスト["Black","White"]を指定すると、リスト内の各要素には、String[]型配列内の各要素が初期設定されます。

 JythonからJavaへの自動変換には、多数のバリエーションが存在します。詳細は、マニュアルの項目を参照してください。機会があれば、後の連載で取り上げます。

次のページ
JavaBeans:イベントハンドラ

この記事は参考になりましたか?

よろずプログラマーのためのPython導入ガイド連載記事一覧

もっと読む

この記事の著者

小泉ひよ子とタマゴ倶楽部(コイズミヒヨコトタマゴクラブ)

http://tamago-club.cocolog-nifty.com/「楽しくなければ仕事じゃない」が私たちのモットー。99%の苦悩の連続も、1%の成功に報われます。だからこそ、この仕事が楽しくて仕方がないのです。楽をするための努力なら惜しみません。何もせず楽をしているのと、努力をしたから楽ができるのと...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

本間 こりす(ホンマ コリス)

新人です。他のみなさんに支えられながら、マイペースで頑張ります。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1799 2007/10/30 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー