αバージョンからβバージョンへの移行

αバージョンとβバージョンの違いを具体的に示し、 αバージョンで作ったアプレットのプログラムをβバージョンに書き直す 方法を説明します。


JDKにはαバージョンのプログラムをβバージョン用に変換する ツール upgrade が付いてきています。 javacappletviewerなどと同じディレクトリにあり、 すぐ使えます。 ただし、これは JDK の中では最も貧弱(手を抜いた?)存在です。 Solaris 用の JDK では sed コマンドを呼び出すわずか 46行の スクリプトです。(1995年12月現在)
使用法は次の通り。

  upgrade < OldApp.java > NewApp.java
upgradeは、 古い関数名や変更になったパッケージ名を新しいものに単純に置き換えるだけです。 (それでも使わないよりはましです。) βバージョンの配布のドキュメントにも記されていますが、 upgrade を通しただけで完全に書き換えができるのは、 ごく単純なアプレットの場合のみです。 「まず upgradeを通し、コンパイルしてエラーが出た箇所を 手で書き直せ。」という、かなり野蛮(?)な方法が推奨されています。
upgradeの非力さを嘆いているユーザーは数多いはずなので、 そのうち誰かが高性能の変換ツールを作ってくれ、 それが Web 上で手に入るかもしれません。

大規模なアプレットの変換は大変な作業になりそうですね。 (実際そうです。) 私の経験では、たとえばゲームのようなある程度大きなアプレットの場合には、 コードを忠実に変換することには結局なりませんでした。 βバージョンでは awt コンポーネント を直接活用できるので、 ユーザー・インターフェイスの部分は根本的に書き直した方が効率的です。 Image の取り扱い も、βバージョンでは大きく変わっています。 またセキュリティ上の理由から、 βバージョンでは使用できなくなった機能の部分は、 別の対策を新たに考えて代替の措置を付け加えなければなりません。

以下にαからβで変更になった箇所を項目別にまとめました。 また upgradeが自動的に変換してくれるかも参考のため付けました。 βバージョンから全く新しく追加されたものに関しては、 ここの表の中には含まれていません。
また、クラスそのものの仕様の変化や機能の分化があるので、 この表だけで完璧なわけではありません。
セキュリティのための制限も、 アプレットからの使用が制限されるだけで、 言語自体から関数が削除されたりしたわけではありません。 したがってupgradeはチェックしません。

パッケージ名・構成の変更
αバージョン βバージョン upgrade の対応
awt.* java.awt.*
awt.* java.awt.*
brower.Applet java.applet.Applet
net.www.* java.net.*

関数名の変更
αバージョン βバージョン upgrade の対応
getAttribute getParameter
setForeground setColor
paint3DRect fill3DRect
draw3Drect
appendChar append
getFocus requestFocus

関数の引数の変更
αバージョン βバージョン upgrade の対応
mouseDown( int, int ) mouseDown( Event, int, int )
mouseUp( int, int ) mouseUp( Event, int, int )
mouseDrag( int, int ) mouseDrag( Event, int, int )
mouseMove( int, int ) mouseMove( Event, int, int )
mouseEnter( ) mouseEnter( Event, int, int )
mouseExit( ) mouseExit( Event, int, int )
keyDown( int ) keyDown( Event, int )
getImage( String ) getImage( URL )
getImage( URL, String )
play( String ) play( URL )
play( URL, String )

関数の型・アクセスモードの変更
αバージョン βバージョン upgrade の対応
void mouseDown() boolean mouseDown() ×(関数の最後に
return文が必須)
void mouseUp() boolean mouseUp() ×(関数の最後に
return文が必須)
void mouseDrag() boolean mouseDrag() ×(関数の最後に
return文が必須)
void mouseMove() boolean mouseMove() ×(関数の最後に
return文が必須)
void mouseEnter() boolean mouseEnter() ×(関数の最後に
return文が必須)
void mouseExit() boolean mouseExit() ×(関数の最後に
return文が必須)
void keyDown() boolean keyDown() ×(関数の最後に
return文が必須)
protected void init() public void init() ×
protected void start() public void start() ×
protected void stop() public void stop() ×

クラスの仕様の変更(一部)
αバージョン βバージョン upgrade の対応
Applet.width Applet.size().width
Applet.height Applet.size().height
Applet.font なくなった ×
Font.stringWidth()など FontMetrics.stringWidth() ×
Image.width Image.getWidth(this) ×
Image.height Image.getHeight(this) ×
Thread.sleep(int) 例外処理が必須