JavaFX

 
→ HOME
→JavaFX
 
 
 
 

 JavaFXプログラミング言語の基礎補遺

JavaFX 1.2 SDK 準拠

更新:09年12月14日

作成:09年01月19日

 

目次

1.変数

2.関数

3.クラス

4.式

5.データ結合

 

 

1.変数

 

(1)組み込み関数isInitialized()

組み込み関数isInitialized()は引数に指定した変数を調べ、(既定値のままではなく)明示的に初期設定されていれば、真(true)を返します。

次の例のように、初期化されていない実体変数を調べて設定する、などの利用法があります(init区画については、後述します)。

 

    class Someone {

        var name: String;

        function printName(): Void {

            println("私の名前は、{name}です");

        }

        init {

            if (not isInitialized(name)) {

                name = "一郎";

            }

        }

    }

    

    Someone{}.printName();

    Someone{name: "次郎"}.printName();

 

上のプログラムを実行すると、画面に次のように表示されます。

 

    私の名前は、一郎です

    私の名前は、次郎です

 

 

(2)疑似変数

擬似変数は、あらかじめ定義された台本階層のdef変数で、値を割り当てることはできません。次の2つが定義されています。

 

・__FILE__

この擬似変数が記述されている台本ファイルのURL文字列を表します。

 

・__DIR__

この擬似変数が記述されている台本ファイルが格納されているディレクトリのURL文字列を表します。

 

例えば、台本ファイルを格納しているのと同じディレクトリに子ディレクトリ「image」を作り、その下に置いた画像ファイル「myPicture.jpg」からデータを取り込んでImageオブジェクトを生成する場合は、次のように記述します。

    Image {

        url: "{__DIR__}image/myPicture.jpg"

    }

Windows基本ソフトウェアの場合でも、ディレクトリ(フォルダ)名は「/」で区切ります(「\」ではありません)。

 

(3)データ型

Java言語と同様の、Byte、Short、Number、Integer、Long、Float、DoubleおよびCharacterなどの数値型も利用できます。

 

 

 

2.関数

 

(1)引数の参照渡しと値渡し

結合関数を、(通常の関数としてではなく)結合の目的で呼び出すときは、引数はその(値ではなく)参照が関数に渡され、関数の戻り値もその参照が返されます。

非結合関数や、通常の関数として呼び出された結合関数では、引数はその値自体が渡され、戻り値もその値自体が返されます。

 

 

 

3.クラス

 

(1)クラス修飾子abstract

修飾子abstractが付いたクラスは「抽象クラス」と呼ばれ、クラスから実体を直に生成することはできません。

    abstract class クラス名 {}

 

(2)クラスの構成要素

 

(a)init区画

init区画は、その存在自体が任意のコード区画で、(存在するときは)クラス実体の初期化の最終段として実行されます。

 

(b)postinit区画

postinit区画も、その存在が任意のコード区画で、(存在するときは)クラス実体の初期化が終了した後に実行されます。

 

(c)実体変数の再定義宣言

実体var変数は、派生クラスでその既定値を変更したり、置換引き金の定義を追加したりすることができます(既定値の変更と置換引き金の追加を一緒に行うこともできます)。

    override var 変数名 = 初期化式 on replace 置換引き金定義

 

(d)実体関数の再定義宣言

実体関数も、派生クラスでその定義を変更することができます。

    override function関数定義

 

 

(3)クラス実体の初期化

 

(a)初期化の順序

新たに生成されたクラスの実体は、次の順序で初期化されます。

    ・オブジェクトを生成します。

    ・(もしあれば)Java基本クラスの既定構築子(default constructor)を

      実行します。

    ・オブジェクト直定数の実体変数の初期化式の値を計算します

      (この時点では、値の設定は行いません)。

    ・JavaFX基本クラスの実体変数を設定します。

    ・当該クラスの実体変数を設定します。

    ・(もしあれば)init区画を実行します。

    ・(もしあれば)postinit区画を実行します。

 

(b)実体変数の初期化の手順

実体変数の初期値は、次の方法で設定されます。

    1)オブジェクト直定数で初期値が与えられているときは、その値に設定されます。

    2)それ以外の場合、変数の再定義で初期化式が定義されているときは、

      その値に設定されます。

    3)変数が再定義されていない場合で、変数が明示的に初期化されているときは、

      その値に設定されます。

    4)これらのいずれの方法でも初期化されない場合は、変数の型に対する既定値に

      設定されます。

    5)以上の設定の後、もしinit区画があれば、その中で初期値を設定しなおす

      ことができます。

 

(4)Mixin継承

JavaFXでは、複数のクラスを継承したクラスを定義すること(多重継承)はできません。その代わりとして、「mixin継承」というJavaFX独特の継承機能があります。

mixinは特殊なクラスで、実体を直に生成することはできません。派生クラスにより継承されることを前提にして設計されています。mixinクラスは、鍵語mixinを用いて、次の形式で定義します。

    mixin class クラス名 {クラスの本体}

派生クラスは、高高1つの非mixinクラスと複数のmixinクラスを継承することができます(複数の非mixinクラスを継承することはできません)。

    class DerivedClass extends NonMixinClass, MixinClass1, MixinClass2 { }

例えば、次のプログラムを実行すると、

 

    mixin class M1 {

        public function foo(): Void {

            println("M1のfoo");

        }

    }

    mixin class M2 {

        public function foo(): Void {

            println("M2のfoo");

        }

    }

    class R {

        public function foo(): Void {

            println("Rのfoo");

        }

    }

    class A extends R, M1, M2 {

        public function bar(): Void {

            R.foo();

            M1.foo();

            M2.foo();

        }

    }

    var a: A = new A();

    a.bar();

 

画面に、次のように表示されます。

 

    Rのfoo

    M1のfoo

    M2のfoo

 

 

 

4.

 

(1)単独で用いられる式

次の式は単独で用いられ、値を持ちません(すなわち、Void型です)。

    insert、delete、while、break、continue、throw、try

 

(a)return式

実行を、関数からその呼び出し側に戻します。その際、関数の戻り値を返すこともできます。

 

(b)throw式

例外を発生させます(「例外を投げる」とも言います)。

 

(c)try式

try区画内で発生した例外を捕捉します。

try区画は、例外が発生しない限り、通常どおり実行されます。例外が発生した時点で、例外の型が、catch節の引数として宣言されたものに一致するかどうか調べられます。一致するcatch節が見つかると、そのcatch節に対応するコード区画に実行が移ります。

一致するcatch節が見つからない場合、例外の発生は、そのtry区画の外に伝えられます。

try式にfinally節があると、例外の発生の有無にかかわらず、finally節に対応するコード区画が実行されます。そのため、finally節は獲得した資源の後始末や解放などに利用されます(例えば、開いたファイルを閉じることなど)。

 

(2)値を持つ式

 

(a)if式

if式は、副次的な型として、then部に対応する式の型とelse部に対応する式の型を持っています。

else部がないか、then部またはelse部のいずれかがVoid型の場合、if式はVoid型となります。

 

(b)for式

in節が多重化されている場合、一番右側のin節が最も内側の繰り返し対応します。for式の本体は、where節が真(true)のときのみ評価されます。

 

(3)列項目または列断片の代入

列の範囲外への代入は、無視されます。代入する列断片の項目数は、代入対象の項目数と同じである必要はありません。

例えば、次のプログラムを実行すると、

 

    var planets = ["地球", "火星"];

    println(planets);

    planets[2] = "木星";

    println(planets);

    planets[0..1] = ["太陽", "水星", "金星"];

    println(planets);

    planets[1..5] = "惑星";

    println(planets);

 

画面に次のように表示されます。

 

     [ 地球, 火星 ]

     [ 地球, 火星 ]

     [ 太陽, 水星, 金星 ]

     [ 太陽, 惑星 ]

 

(4)and式とor式

論理積andと論理和orの演算では、値が確定した時点で演算を打ち切ります。

すなわち、and演算では、左辺が偽(false)なら(結果は必ず偽(false)になるので)右辺の評価は行いません。同様に、or演算では左辺が真(true)なら(結果は必ず真(true)になるので)右辺は評価されません。

 

(5)関係式

Javaプログラミング言語の場合と異なり、等価演算子「==」と不等価演算子「!=」は、オブジェクトの同一性の比較ではなく、値そのものの比較を行います。

 

(6)基本式

 

(a)オブジェクト直定数

オブジェクト直定数の実体変数の初期化式は、任意の順序で記述することができ、記述された順に評価されます。

次の例のように、オブジェクト直定数内に局所的な変数や関数を定義し、初期化に利用することもできます。

    class Square {

        var side: Number;

        function calcArea(): Number {

            side * side;

        }

    }

    def aSquare = Square {

        def circumference = 40.0;

        side: circumference / 4

    }

    println("正方形の面積は{aSquare.calcArea()}です");

 

(b)this式

this式は、それを実行しているオブジェクト自身を表します。

 

(c)値域式

値域式は、Integer型またはNumber型のある範囲の値から成る列を生成します。

初項、終項、公差の内のいずれかがNumber型の場合、値域式はNumber型の列になります。列の各項目は、初項から始まり、終項を超えない範囲の値です。例えば、次のプログラムを実行すると、

 

    var evens = [20.0 .. 10.0 step -3.0];

    println(evens);

 

画面に次のように表示されます。

 

    [ 20.0, 17.0, 14.0, 11.0 ]

 

 

(d)関数式

関数式を用いることにより、関数型の変数を宣言することができます。

    var calc: function(:Integer): Integer;

    calc = function(n) {n + 2}

    println(calc(10));

    calc = function(n) {n - 2}

    println(calc(10));

上の例で、calcは関数型の変数として宣言されています。2行目で、calcには2を加える関数が割り当てられますので、3行目では12と表示します。また、4行目では2を減ずる関数が割り当てられますので、5行目では8と表示します。

 

 

 

5.データ結合

 

(1)結合による更新

 

(a)条件式に結合する

    def x = bind if (条件) 式1 else 式2;

条件式への結合では、条件が変わるとif式のどちらの選択肢を再評価するかが変わります。

条件が真(true)になると、式1が再計算され、式2は再計算されません。逆に、条件が偽(false)になると、式2が再計算され、式1は再計算されません。

 

(b)区画式に結合する

区画式に結合する場合、区画の最後の式以外はdef変数の定義でなければなりません。var変数は使用できません。また、代入式も記述できません。

    bind {

        def 変数 = 式;

        def 変数 = 式;

        ...

        def 変数 = 式;

        式

    }

while、insert、deleteなどの値を持たない式は、結合区画内では使用できません。値を持たないため、結合対象となる区画の最終式にはなりえず、変数宣言ではないため、最終式以外としても記述できないからです。

 

Yahoo!ジオシティーズ