客戶端開發向來非 Java 程式員舒適區:Applet/Swing/JavaFX 成果有限,JavaScript 僅名字相似。但 ActionScript 3 (AS3) 隨 Adobe Flex/Flash 而來,強型別、一級物件導向、介面、屬性存取器、E4X 原生 XML 操作 等特性,讓 Java 開發者倍感親切。Flex SDK 完全免費,Flex Builder IDE 付費但功能強大。
AS3 同樣「一切皆物件」(基本型別除外),支援套件命名空間 (如 com.jherrington.animals)。
package com.jherrington.animals {
public class Animal {
public var name:String = "";
private var age:int = 0;
private var myLocation:Point = new Point(0,0);
public function Animal(_name:String, _age:int = 30) {
name = _name;
age = _age;
}
// 屬性存取器 (關鍵差異)
public function set location(pt:Point):void { myLocation = pt; }
public function get location():Point { return myLocation; }
public function moveTo(x:int, y:int):void {
myLocation.x = x; myLocation.y = y;
}
}
}
型別宣告後置 (var name:String) 因強型別為後加特性,保留舊代碼相容。建構子同類名,支援預設參數值。
繼承 EventDispatcher,在 setter 發送事件:
public function set location(pt:Point):void {
myLocation = pt;
dispatchEvent(new Event(Event.CHANGE));
}
客戶端程式碼:
var a:Animal = new Animal();
a.addEventListener(Event.CHANGE, function(e:Event):void { trace("The animal has moved!"); });
a.location = new Point(10, 20); // 觸發 setter 並發送事件
大多數類別均為 EventDispatcher,可輕鬆加入監聽器。
public interface IAnimal {
function get name():String;
function set name(n:String):void;
function get location():Point;
function set location(pt:Point):void;
}
public class Animal extends EventDispatcher implements IAnimal {
private var myName:String = "";
public function get name():String { return myName; }
public function set name(n:String):void { myName = n; dispatchEvent(new Event(Event.CHANGE)); }
// ... location getter/setter 同前
}
介面可定義屬性存取器,單一繼承、多重實作同 Java。
public const MINIMUM_AGE:int = 0;
public const MAXIMUM_AGE:int = 2000;
public static function buildAnimal(n:String):IAnimal { return new Animal(n); }
// 單例工廠
public class AnimalFactory {
private static var _factory:AnimalFactory = new AnimalFactory();
public static function get instance():AnimalFactory { return _factory; }
public function build(n:String):Animal { return new Animal(n); }
}
// 使用
var b:Animal = AnimalFactory.instance.build("Russell");
public class Animal extends EventDispatcher implements IAnimal {
public virtual function move(x:int, y:int):void { } // virtual 允許覆寫
}
public class Dog extends Animal {
public function Dog(_name:String) { super(_name); }
public override function move(x:int, y:int):void { trace('Moving to '+x+', '+y); }
}
virtual/override 關鍵字明確控制繼承鏈,極似 Java。
算術、邏輯、三元運算子語法完全相同。if/else、try/catch/finally、throw new Exception() 無差異。自訂異常類別同樣支援。
無強型別容器類,但陣列與雜湊表 (基於 Object 插槽機制) 使用直觀:
// 陣列迭代 (推薦 for each)
var values:Array = [1, 2, 5];
for each (var i:int in values) trace(i);
// 雜湊表
var params:Object = { first:'Jack', last:'Herrington' };
for (var key:String in params) trace(key + ' = ' + params[key]);
正則為語法內建:if (name.search(/jack/i)) trace('hello jack');、values.split(/,/)。
var myData:XML =
Jack
Oso
Sadie
;
for each (var name:XML in myData..name) trace(name.toString());
// 依屬性過濾 (@ 類 XPath)
var myData:XML =
Jack
Oso
Sadie
;
for each (var name:XML in myData..name.(@type=='dog')) trace(name.toString());
E4X 將 XML 解析從繁瑣變為輕鬆,Web Service 回傳 E4X 格式更便於處理。
AS3 吸取 Java 得失教訓,融合強型別、物件導向、事件模型、原生 XML,是成熟度極高的客戶端語言。Java 開發者幾乎零學習曲線即可投入 Flex/Flash 開發,值得深入探索。