宣言
変数
Java は以下のように変数宣言をします。
public int foo; public Object bar = new Object();
AS3では以下のように、var
キーワードを使います。型は変数名の後に":
"を挟んで付けます。変数宣言はJavaと大きく違う点の1つです。
public var foo:int; public var bar:Object = new Object();
関数
Javaは以下のように関数を宣言します。
public int foo(String str);
AS3ではfunctionキーワードを使います。変数の宣言と同様に":
"の後に型を指定します。
public function foo(str:String):int;
スコープ
Javaはブロックが変数のスコープになります。下の2つのfor
ブロック内のi
は別の変数として扱われます。
public void foo() { for (int i = 0; i < 10; ++i) {} for (int i = 0; i < 5; ++i) {} }
AS3にはブロックスコープがありません。関数が最小のスコープ単位になります。下のように、ブロック内では変数宣言を記述しないようにするのが推奨です。
public function foo():void { var i:int; for (i = 0; i < 10; ++i) {} for (i = 0; i < 5; ++i) {} }
Finalとconst
Javaにはfinal
というキーワードがあります。定数を宣言したい場合に使えます。
public static final int FOO = 5;
AS3で定数を宣言する場合はconst
を使います。varが不要なことに注意してください。
public static const FOO:int = 5;
配列
Javaの配列は大きさと型が決まっています。
int myArray[] = new int[5];
AS3の配列は、型を指定することが出来ません。また大きさも動的に変化します。
var myArray:Array = new Array(5); myArray[0] = 0; myArray[9] = "foo";
配列の初期化
Javaの配列は、初期化子を使って宣言することができます。大きさは、指定した要素数に固定されます。
int myArray[] = {0, 1, 2};
AS3の場合は、[]
を使って初期化子を指定します。大きさも型も不定です。
var myArray:Array = ["zero", 1, "2"]; myArray[9] = "きゅう";
ジェネリクスとコレクション
Javaでは汎用のコレクションと型の指定されたコレクションが使えます。
List<String> myList = new ArrayList<String>(); myList.add("foo"); String foo = myList.get(0);
AS3には同等の機能はありません。が、Vector
を使って型の指定された配列を使うことが出来ます。<>
の前にドット(.
)があることに注意してください。
var myList:Vector.<String> = new Vector.<String>(); myList.push("foo"); var foo:String = myList[0];
XML
Javaでは、XMLはJAXP,JAXB,SAX,Xerces,JDOMなどの様々なライブラリを使って処理します。
AS3はE4Xを使います。E4Xは言語に組み込まれているため、別途ライブラリを必要としません。スクリプト内に直接XML文を書いて初期化できます。
var myXML:XML = <order><item>beer</item></order>; var item:String = myXML.item;
E4Xについて、詳しくはXMLの操作をご覧ください。
正規表現
Javaで正規表現を使うには、java.util.regexパッケージを使用します。
Pattern pattern = Pattern.compile("\d+"); Matcher matcher = pattern.matcher("foo"); if (matcher.matches()) { ... }
AS3ではRegExp
クラスを使用します。直接スクリプト内に正規表現を書いて初期化することができます。
var pattern:RegExp = /\d+/; var str:String = "foo"; if (pattern.test(str)) { ... }
アノテーションとメタデータ
Javaはアノテーションが使用できます。
@Meta1 public class Foo { @Meta2 String bar; }
AS3では同様の目的でメタデータが使用できます。
[Meta1] public class Foo { [Meta2] var bar:String; }
パッケージ
Javaはパッケージ名をファイル内に宣言します。Javaのパッケージ宣言はファイル全体で有効です。
package foo; class Foo {}
AS3は、クラスをパッケージブロック内に宣言します。AS3では、複数のパッケージ定義を1つのファイルで行うことが可能です。
package foo { class Foo {} }
名前空間
Javaでは、パッケージに属する範囲を「名前空間」と呼ぶのが一般的です。
package my.package;
AS3では、名前空間はパッケージとは異なる概念です。パッケージは名前の競合を避けるため、名前空間は属性やメソッドのアクセス制御に使われます。名前空間はnamespace
を使って宣言します。
package my.package { namespace my_space; }
アクセスレベル
Javaではアクセス修飾子を使って、以下の4種類のアクセスレベルを設定することができます。
- public:すべてのクラスとパッケージからアクセス可能
- protected:同一パッケージ内とサブクラスからアクセス可能
- 修飾子なし:同一パッケージ内からアクセス可能
- private:同一クラス内からアクセス可能
AS3では、名前空間を可視性の制御に使用します。標準で定義されている名前空間には以下のものがあります。
- public:すべてのクラスとパッケージからアクセス可能
- protected:同一クラス内とサブクラスからアクセス可能
- internal:同一パッケージ内からアクセス可能
- 指定なし:同一パッケージ内からアクセス可能
- private:同一クラス内からアクセス可能
名前空間が宣言されていないと、internalとして扱われます。Javaと異なるのは、protectedが同一パッケージ内からでもサブクラス以外はアクセスできない点です。
この記事の続き『JavaとActionScript 3の違い:クラス宣言編』は、Adobe Developer Connectionで公開中です。