JavaFX Scriptプログラム言語を学ぼう

レッスン11:アクセス修飾子


さて、あなたはパッケージを理解しました。 私達はJavaFXプログラム言語が提供する様々なアクセス修飾子についてお話します。 この特殊なキーワードは、あなたの変数、関数やクラスの可視属性の様々なレベルを設定できるようにします。 さらに詳しい情報は、 JavaFX言語リファレンス8章. アクセス修飾子をご覧ください。

デフォルトアクセス


デフォルトのアクセスは、「スクリプト限定」として知られていて、アクセス修飾子を与えないときに 得られるものです。これはチュートリアルのほとんどを通して私達が使ってきたものです。

例:

var x;
var x : String;
var x = z + 22;
var x = bind f(q);

このレベルのアクセスを使うと、変数の初期化、オーバーライド、参照、設定やバインドが スクリプトの中から可能です。他のソースからはこの情報を読んだりアクセスすることができません。

packageアクセス修飾子


変数、関数やクラスを同じパッケージの他のコードにアクセスさせるには、packageアクセス修飾子を使います。

package var x;

前のレッスンに書いたpackage宣言と、このアクセス修飾子を混同しないように気をつけてください。

例:

// Inside file tutorial/one.fx
package tutorial; // places this script in the "tutorial" package
package var message = "Hello from one.fx!"; // this is the "package" access modifier
package function printMessage() {
     println("{message} (in function printMessage)");
}

// Inside file tutorial/two.fx
package tutorial;
println(one.message);
one.printMessage();

あなたはこのサンプルをコンパイルして(tutorialの親ディレクトリから)次のコマンドで 実行することができます。

javafxc tutorial/one.fx tutorial/two.fx
javafx tutorial/two

出力結果:

Hello from one.fx!
Hello from one.fx! (in function printMessage)

protectedアクセス修飾子


protectedアクセス修飾子は変数や関数を、同じパッケージの他のコードと、 パッケージを問わずサブクラスからのアクセスを可能にします。

例:

// Inside file tutorial/one.fx
package tutorial;
public class one {
     protected var message = "Hello!";
}

// Inside file two.fx
import tutorial.one;
class two extends one {
     function printMessage() {
          println("Class two says {message}");
     }
};

var t = two{};
t.printMessage();

このデモをコンパイルして実行してみます。

javafxc tutorial/one.fx two.fx
javafx two

出力結果:

Class two says Hello!

注意:このアクセス修飾子はクラスに適用できません。なぜなら私達はoneクラスをpublicとしたからです。

publicアクセス修飾子


publicなクラス、変数や関数はもっとも良く見えます。 あらゆるパッケージのあらゆるクラスやスクリプトからアクセスできます。

例:

// Inside file tutorial/one.fx
package tutorial;
public def someMessage = "This is a public script variable, in one.fx";
public class one {
     public var message = "Hello from class one!";
     public function printMessage() {
          println("{message} (in function printMessage)");
     }
}

// Inside file two.fx
import tutorial.one;
println(one.someMessage);
var o = one{};
println(o.message);
o.printMessage();

この例をコンパイルして実行します。

javafxc tutorial/one.fx two.fx
javafx two

出力結果:

This is a public script variable, in one.fx
Hello from class one!
Hello from class one! (in function printMessage)

public-readアクセス修飾子


public-readアクセス修飾子はpublicに参照可能な変数を定義しますが、 (デフォルトでは)そのスクリプトの中からだけは書き込みが可能です。 書き込みのアクセス対象を広げるには、packageかprotected修飾子を頭に付けてください。 (例えばpackage public-readやprotected public-read) そうすれば、書き込みアクセスはpackageやprotectedレベルに設定されます。

例:

// Inside file tutorial/one.fx
package tutorial;
public-read var x = 1;

// Inside tutorial/two.fx
package tutorial;
println(one.x);

この例をコンパイルして実行します。

javafxc tutorial/one.fx tutorial/two.fx
javafx tutorial/two

出力結果は"1"です。これはxがtutorial/one.fxスクリプトの外から参照できることを裏付けます。

これから、その値を変更してみましょう。

// Inside tutorial/two.fx
package tutorial;
one.x = 2; 
println(one.x);

結果はコンパイルエラーとなりました。

tutorial/two.fx:3: x has script only (default) write access in tutorial.one
one.x = 2;
   ^
1 error

これを動かすには、私達はxの書き込みアクセス対象を広げなければなりません。

// Inside file tutorial/one.fx
package tutorial;
package public-read var x = 1;

// Inside tutorial/two.fx
package tutorial;
one.x = 2;
println(one.x);

例は今度はコンパイルできコンソールに"2"を印字するでしょう。

public-initアクセス修飾子


public-initアクセス修飾子は、あらゆるパッケージのオブジェクトリテラルで、 publicに初期化できる変数を定義します。 しかしながら、その後の書き込みアクセスは、public-readと同様の規制がなされます。 (デフォルトではスクリプトレベルの書き込みアクセスですが、packageやprotectedを前に 付けるとそれに応じて書き込みアクセス対象が広がります。) この変数の値は常にあらゆるパッケージから参照可能です。

例:

// Inside file tutorial/one.fx
package tutorial;
public class one {
     public-init var message;
}

// Inside file two.fx
import tutorial.one;
var o = one {
     message: "Initialized this variable from a different package!"
}
println(o.message);

例をコンパイルして実行します。

javafxc tutorial/one.fx two.fx
javafx two

これは"Initialized this variable from a different package!"を印字し、 異なるパッケージのオブジェクトリテラルがmessage変数を初期化できることを裏付けます。 しかし、その後の書き込みアクセスはスクリプトに限定されますから、 私達はその値を変更できません。

// Inside file two.fx
import tutorial.one;
var o = one {
     message: "Initialized this variable from a different package!"
}
o.message = "Changing the message..."; // WON'T COMPILE
println(o.message);

コンパイルエラーはこうなります。

two.fx:12: message has script only (default) write access in tutorial.one
o.message = "Changing the message..."; // WON'T COMPILE
 ^
1 error

これは期待される行動を次のように確認しています。 変数はpublicに初期化できますが、その後の書き込みアクセスは異なるレベルのアクセスで規制されています。


Home