Hatena::ブログ(Diary)

flashrod このページをアンテナに追加 RSSフィード

2006-12-12 Java 5 と ActionScript 3 の構文比較

Java 5 と ActionScript 3 の構文比較 22:24 Java 5 と ActionScript 3 の構文比較を含むブックマーク

Farata Systems » Comparing the syntax of Java 5 and ActionScript 3

を訳してみた。AS3に入門するJavaプログラマには役に立つかもしれない。怪しいところは原文や言語仕様に当たってください。

概念/言語構造 Java 5.0 ActionScript 3.0
クラスライブラリのパッケージ化 .jar .swc
継承

class Employee extends Person{…}

class Employee extends Person{}

変数の宣言と初期化

String firstName="John";
Date shipDate=new Date();
int i;
int a, b=10;
double salary;

var firstName:String="John";
var shipDate:Date=new Date();
var i:int;
var a:int, b:int=10;
var salary:Number;

宣言されてない変数 なし ワイルドカード型表記 *と等価。

型を指定せずに変数を宣言したときは、*が適用される。

初期値は undefined

var myVar:*;

変数のスコープ ブロック: カーリーブラケットの内側で宣言されたもの

ローカル: メソッドやブロックの内側で宣言されたもの

メンバー: クラスのレベルで宣言されたもの

グローバル変数は無い。

ブロックスコープは無い: 最小のスコープは関数

ローカル: 関数の内側で宣言されたもの

メンバー: クラスのレベルで宣言されたもの

関数やクラスの定義の外側で宣言された変数は、グローバルスコープとなる。

文字列 不変、2バイトユニコード文字の列を格納する 不変、2バイトユニコード文字の列を格納する
セミコロンによるステートメントの終端 必須 1行に1ステートメントで書くなら、セミコロンを省略できる
厳密な(strict)等価比較演算子 なし ===

厳密に等しくない比較には

!==

を使う。

定数修飾子 finalキーワード

final int STATE="NY";

constキーワード

const STATE:int ="NY";

型検査 静的(コンパイル時検査) 動的(実行時検査)と静的(‘strict モード’と呼ばれる。Flex Builderではデフォルト)
型検査演算子 instanceof isがデータ型を検査する。

if (myVar is String){}

is演算子は、旧 instanceofから置き換わった。

as 演算子 なし is演算子と似てるけど、論理値を戻さないで、式の結果を戻す。

var orderId:String="123";
var orderIdN:Number=orderId as Number;
trace(orderIdN); // 123を印字

プリミティブデータ型 byte, int, long, float,

double, short, boolean, char

ActionScriptの全てのプリミティブデータ型はオブジェクト

Boolean, int, uint, Number, String


次の2行は等価

var age:int = 25;
var age:int = new int(25);

複合データ型 なし Array, Date, Error, Function,

RegExp, XML, XMLList

配列の宣言とインスタンス

int quarterResults[];
quarterResults = new int[4];
int quarterResults[]={25,33,56,84};

var quarterResults:Array=new Array();

または

var quarterResults:Array=[];
var quarterResults:Array=[25, 33, 56, 84];

AS3には連想配列*1もある。連想配列は数値インデックスの代わりに、名前つき要素を使う(ハッシュテーブルと似ている)。

継承ツリーのトップクラス Object Object
キャスト構文: ObjectクラスをPersonにキャストする

Person p=(Person) myObject;

var p:Person= Person(myObject);

または

var p:Person= myObject as Person;

アップキャスト

class Xyz extends Abc{}
Abc myObj = new Xyz();

class Xyz extends Abc{}
var myObj:Abc=new Xyz();

型なし変数 なし

var myObject:*
var myObject:

パッケージ

package com.xyz;
class myClass {…}

package com.xyz{
class myClass{}
}

ActionScriptのパッケージはクラスだけじゃなくて分離した関数も含めることができる。

クラスのアクセスレベル public, private, protected

何も指定しない場合、クラスはパッケージアクセスレベルになる。

public, private, protected

何も指定しない場合、クラスはinternalアクセスレベルとなる(Javaのパッケージアクセスレベルと似ている)。

カスタムアクセスレベル: 名前空間 なし XML名前空間と似ている。

namespace abc;
abc function myCalc(){}

または

abc::myCalc(){}
use namespace abc ;

コンソール出力

System.out.println();

// デバッグモードのみ
trace();

インポート

import com.abc.*;
import com.abc.MyClass;

import com.abc.*;
import com.abc.MyClass;

コード中でクラス名が完全修飾名であったとしても、パッケージのインポートは必要。

キー-値の順序無しペア Hashtable, Map

Hashtable friends = new Hashtable();
friends.put("good","Mary");
friends.put("best","Bill");
friends.put("bad","Masha");
String bestFriend= friends.get("best");
// bestFriend is Bill

連想配列

インデックスの代わりに名前で要素を参照することができる。

var friends:Array=new Array();<br>
friends["good"]="Mary";
friends["best"]="Bill";
friends["bad"]="Masha";
var bestFriend:String= friends["best"]
friends.best="Alex";

他の構文

var car:Object = {make:"Toyota", model:"Camry"};
trace (car["make"], car.model);
// Output: Toyota Camry

ホイスティング なし コンパイラは全ての変数宣言を関数の先頭へ移動する。

よって変数名はコード中でそれが明示的に宣言される前でもつかうことができる。

クラスからオブジェクトインスタンス化する

Customer cmr = new Customer();
Class cls = Class.forName("Customer");
Object myObj= cls.newInstance();

var cmr:Customer = new Customer();
var cls:Class = flash.util.getClassByName("Customer");
var myObj:Object = new cls();

プライベートクラス

private class myClass{…}

プライベートクラスはAS3には無い。
プライベートコンストラクタ サポートされてる。典型的な使い方はシングルトンクラス。 利用できない。

プライベートコンストラクタの実装は、まだ ECMAScript 標準でないとのことで先送りされた。

シングルトンを作成するには、public static getInstance() を使って、

最初のインスタンス化のあとで privateな instanceExists フラグをセットし、

このフラグを public コンストラクタで検査して、

もし instanceExists が真なら、エラーをスローする。

クラスとファイル名 一つのファイルに複数のクラスの宣言を持つことができるが、

そのうち public になれるのは一つだけで、

ファイル名はこのクラスと同じ名前でなければならない。

ひとつのファイルに複数のクラスの宣言を持つことができるが、

パッケージ宣言の内側に置けるのは一つだけで

ファイル名はこのクラスと同じ名前でなければならない。

パッケージに何が置けるか クラスとインターフェース クラス、インターフェース変数関数名前空間、実行可能なステートメント。
動的なクラス(実行時にプロパティとメソッドを加えるか変えることによってオブジェクトの定義を変更することができる)

なし

dynamic class Person {
var name:String;
}
//Dynamically add a variable // and a function
Person p= new Person();
p.name="Joe";
p.age=25;
p.printMe = function () {
trace (p.name, p.age);
}
p.printMe(); // Joe 25

関数クロージャ なし。クロージャJava 7 での追加が提案されている。

myButton.addEventListener("click", myMethod); 

クロージャはいわゆる一つのオブジェクトである。それは語彙文脈(スコープにある変数の値、オブジェクト)で関数スナップショットを表すものである。

関数クロージャ引数として通用でき、いかなるオブジェクトの一部となることなしに実行されることができる。

抽象クラス サポートされている なし
関数オーバーライド サポートされている。 サポートされている。override修飾子を使わなければならない。
関数オーバーロード サポートされている サポートされてない
インターフェース

class A implements B{…}

インターフェースにはメソッド宣言と final 変数を含めることができる。

class A implements B{}

インターフェースに含めることができるのは関数宣言だけ。

例外ハンドリング

キーワード: try,catch,throw,finally,throws

キャッチされない例外は、呼び出しているメソッドに伝播される。

キーワード: try,catch,throw,finally

メソッドは例外を宣言する必要はない。

Errorだけじゃなく、数値もスローできる。

throw 25.3;

キャッチしない例外があった場合、Flashプレイヤーはスクリプトを終了させる。

正規表現 サポートされている サポートされている

追記

訂正

  • 「オーバーラード」→「オーバーライド」
  • 「プリミティブ」→「プリミティブデータ型」
  • 「複雑な型」→「複合データ型」

*1Adobe Flex 2 リファレンスガイドでは「結合配列」と表記しているけど、ここでは「連想配列」にしてみた。

とおりすがりとおりすがり 2006/12/13 07:39 定数修飾子 のところの例コードが(文脈の意味は通じますが)すこしおかしいような気がするのと、『関数オーバーラード』というのは一般的には 関数オーバーライド ではないでしょうか。

flashrodflashrod 2006/12/13 21:11 ご指摘ありがとうございます。typoは直しました。ラード、脂か!
定数の例は確かにおかしいですけど原文ママなので、こういうのは残すべきか直すべきか、悩む。