ついにベールを脱いだJavaFX

第3回 基本的な文法を理解する

この記事を読むのに必要な時間:およそ 11 分

変数と定数

今まで,変数は何度も使用してきましたが,正しい定義は説明していませんでした。変数は var キーワードを使用して定義します。

リスト16

var 変数名: 型;

変数の定義文で変数の初期化を行う場合,変数の型は明らかなので省略することが可能です。

リスト17

var message = Text {
    content: "Message"
};

この場合,式の右辺がTextオブジェクトを表しているので,自動的に変数messageの型はTextクラスとなります。

式の右辺のオブジェクトと異なるクラスを型としたい場合は明記する必要があります。

リスト18

import javafx.scene.Node;
import javafx.scene.text.Text;

var message: Node = Text {
    content: "Message"
};

ここでは,変数messageの型を,javafx.scene.text.Textクラスのスーパークラスであるjavafx.scene.Nodeクラスに指定しています。

次は定数です。定数はdefキーワードで定義します。

リスト19

def 変数名: 型 = 値;

定数なので,必ず定義する時に初期化も一緒に行う必要があります。もちろん,defで定義した定数を後から変更することはできません。

リスト20

def pi = 3.1415;
def hello = "Hello, World!";

関数

JavaFX Scriptではメソッドを関数として表します。関数の定義はfunctionキーワードを使用して行います。なお,インタープリタ版ではfunctionだけでなく,operationも使用されていましたが,functionに統一されました。

リスト21

function 関数名(引数1: 型, 引数2: 型): 戻り値の型 {
    // 関数で行う処理 
}

ここでは2つの引数を取る場合を示しましたが,もちろん引数がない場合や,もっと多数の引数でもかまいません。ただし,可変引数は使用できません。

戻り値はJavaと同じくreturn文で記述します。return文がない場合,関数の最後の行が示しているオブジェクトを戻り値とします。

リスト22

function add(x: Number, y: Number): Number {
    return x + y;
}
 
function sub(x: Number, y: Number): Number {
    // 下の行が戻り値として使用される
    x - y;
}
 
var a = 10.0;
var b = 5.0;
 
println("{a} + {b} = {add(a, b)}");
println("{a} - {b} = {sub(a, b)}");

add関数はreturnが表記されていますが,subはreturn文がありません。しかし,関数の最後の行,ここでは1行しかないのでx - yが戻り値となります。

実行すると,次のようになります。

10.0 + 5.0 = 15.0
10.0 - 5.0 = 5.0

戻り値がない場合,戻り値の型はVoidとして定義します。

リスト23

function hello(name: String): Void {
    println("Hello, {name}!");
};

また,戻り値の型の定義がないメソッドはreturn文,もしくは関数の最後の行が示すオブジェクトの型になります。したがって,次の例のhelloメソッドの戻り値の型はStringとなります。

リスト24

function hello(name: String) {
    "Hello, {name}!";
}

println(hello("World");

したがって,このスクリプトを実行すると次のように出力されます。

Hello, World!

名前のない無名関数を定義することも可能です。

JavaFX Scriptでは変数やアトリビュートを関数型とすることができます。関数型の変数/アトリビュートに関数を代入する時に無名関数が使用されます。無名関数は関数名を表記する部分にfunctionと記述します。

リスト25

// 変数を関数型で定義し,後から無名関数を代入する
var add: function(Number, Number): Number;

add = function(x: Number, y: Number): Number {
    return x + y;
}

// 変数の定義時に,無名関数を代入する
var sub = function(x: Number, y: Number): Number {
    x - y;
}
 
var a = 10.0;
var b = 5.0;
 
// 関数型の変数は,通常の関数と同様にコール可
println("{a} + {b} = {add(a, b)}");
println("{a} - {b} = {sub(a, b)}");

変数の定義に関数型を明示する場合は,引数と戻り値を明記します。変数に無名関数を代入する場合,定義した引数および戻り値と合わせるようにします。関数型の変数が示している関数をコールする場合,通常の関数をコールするのと変わりません。ちなみに,インタープリタ版では(add)(a, b)のように変数名を括弧でくくる必要があったのですが,1.0では括弧が不必要となりました。

この関数型の変数はイベント処理などのハンドラなどに多用されます。Javaではリスナをインプリメントした無名クラスを作成してメソッドを実装しますが,JavaFX Scriptでは直接関数を代入できるため簡潔に表すことができます。

著者プロフィール

櫻庭祐一(さくらばゆういち)

横河電機に勤務するかたわらJava in the Boxにて新しい技術を追い続けています。JavaOneは今年で11年目。名実共にJavaOneフリークと化しています。