GWTのメモ
Javaとの違いの部分をちょっとメモ。いつの間にかMacOSXもサポートしてた。でもSafari3が必須らしい。
メールアプリのデモがかっこいい。
言語
Java5以降の文法をサポート。GWT1.5ではGenericsが使えます。
- 型:プリミティブ(boolean, byte, char, short, int, long, float, double)、Object, String, 配列、ユーザ定義クラスが全て使えます。
- JavaScriptにおいてnumber型は64bit浮動小数点のみです。
- そのため、long以外の数値プリミティブは、Webモードにおいてdoubleとして扱われます。
- longについて
- JavaScriptは64bit整数をもっていません。そのため、32bit整数のペアでエミュレートしています。
- longの多用はパフォーマンスに影響があります。
- longはJSNIで使用できません。
- 例外:try, catch, finalyが通常どおり使えます。
- ただし、Throwable.getStackTraceはWebモードでサポートされません。
- NullPointerException、StackOverflowError、OutOfMemoryErrorなどいくつかの例外はWebモードでは発生しません。
- その代わり、JavaScriptExceptionが生成されます。
- これはJavaScriptの例外が正しくJavaの例外へマッピングできないためです。
- アサーション
- assert文はHostモードで常に有効です。
- GWTコンパイラはすべてのアサーションを取り除きます。
- マルチスレッドと同期
- JavaScriptはシングルスレッドであり、マルチスレッドをサポートしていないので、以下のものは使えません
- synchronizedキーワード
- Object.wait()
- Object.notify()
- Object.notifyAll()
- JavaScriptはシングルスレッドであり、マルチスレッドをサポートしていないので、以下のものは使えません
- リフレクション
- 効率化のため、GWTはJavaソースを単一のスクリプトにコンパイルし、クラスの動的ロードをサポートしません。
- 最適化のためリフレクションはサポートしません。
- ただし、オブジェクトのクラス名を取得するため、Object.getClass().getName()は使えます。
- ファイナライズ
- JavaScriptではガベージコレクション時のFinalizeをサポートしていません。
- そのため、JavaのFinalizerはWebモードで使えません。
- 厳密浮動小数
- Java言語仕様ではstrictfpキーワードで厳密浮動小数が使えますが、GWTではサポートしません。
ライブラリ
Java2SEとEEの小さなサブセットクラスを提供します。
- いくつかのパッケージとクラスのみ使えます。
- java.lang
- java.lang.annotation
- java.util
- java.io
- java.sql
- Listとかも使えます。
- 加えて、GWTのAPIがあります。
- 直接提供すると高価すぎる機能を似た機能として提供しています
- java.util.DataTimeFormat → com.google.gwt.i18n.client.DateTimeFormat
- java.util.NumberFormat → com.google.gwt.i18n.client.NumberFormat
- java.io.Serializable → com.google.gwt.user.client.rpc
- java.util.Timer → com.google.gwt.user.client.Timer
- その他もろもろ。
- 一部のライブラリの挙動の違い
- 正規表現:JavaとJavaScriptの正規表現はにていますが一致していません。
そのため、正規表現の意味がJavaScriptと同じか注意してください。 - シリアライズ:Java標準をサポートしません。
- JavaのシリアライズはJavaScriptにコンパイルされたときにいくつか使えない機能を使用しています。
- 動的クラスロード
- リフレクション
- その代わり別のシリアライズの方法が用意されています。
- 正規表現:JavaとJavaScriptの正規表現はにていますが一致していません。
0 件のコメント:
コメントを投稿