JavaScript Diary

JavaScript を先取る3 [ 2001/09/18 ]
前回の続きです。今回は以下の語について説明します。
static, final, private, protected, public
これらはメンバに適用された場合、以下のような意味になります。

private : アクセスレベル。指定されたクラスだけからアクセスが可能
protected : アクセスレベル。同じパッケージ内からアクセスが可能。
public : アクセスレベル。どのクラスからでもアクセス可能。
static : クラス変数、クラスメソッド
final : 定まった値(関数)という意味
abstract : 抽象メソッドの宣言
synchronized : メソッドに適用。マルチスレッド時に関係
native : メソッドに適用。その言語以外で書かれたメソッドに関する指定

アクセスレベルはどの範囲でメンバが扱えるかを決めるものです。容易にアクセスして欲しくない変数もあるものです。 例えば、JavaScript で以下のようなプログラムがあるとします(あまり良い例ではありませんが)。
function MyClass( n ){
    this.num = n ;
    this.per = n/100 ;
}
MyClass.prototype.setValue = function( n ){
    this.num = n ;
    this.per = n/100 ;
};
MyClass.prototype.getValue = function(){ return this.per ; };
この per は常に num の100分の1を保持し、連動しています。クラス作成者は num の値を変更するときは必ず setValue メソッドを使用して欲しいと考えますが、これを知らないで利用するユーザーは obj.num=20 とかみたいに直接代入し兼ねません。そこでアクセスレベルの登場となります。JavaScript 風に書くなら、↓のようになるでしょうか。
function Dimension( x, y ){
    private this.x = x ;
    private this.y = y ;
}

Dimension.prototype.setX = function( x ){ this.x = x ; };
Dimension.prototype.setY = function( y ){ this.y = y ; };

Dimension.prototype.getX = function(){ return this.x ; };
Dimension.prototype.getY = function(){ return this.y ; };
このようにアクセスレベルを指定しておいて直接メンバ変数にアクセスできないようにします。つまり設定には set を、取得には get メソッドを必ず使用することになるわけです。
この機能は現在の JavaScript では実装できませんが、Netscape では似たような制御を実装することが出来ます。これについてはまた今度。
次に static はそれがクラスメンバであるときに使用します。JavaScript ではクラスメンバは
function Dimension( x, y ){
    this.x = x ;
    this.y = y ;
}

Dimension.SQRT2 = 1.41421356 ;
Dimension.add = function( a, b ){ return new Dimension( a.x+b.x, a.y+b.y ); };
という風に定義できましたが、static を使うと、
class Dimension{
    ...
    static SQRT2 = 1.41421356 ;
    static Dimension add( ...
    ...
}
というような感じになります。
final はメンバ変数に適用するとそれは定数になり、メソッドに適用するとサブクラスで再定義できないメソッドになります。まさにfinal(最終的な決定された)という意味です。JavaScript では、これを実現できません(ただしNetscape4では近いことができる)。
abstract, synchronized, native に関しては説明を省かせてもらいます。

今回説明したものは兎に角便利なものが多く、早く使用出来るようになって欲しいです。切望しております。

次回も用語について説明していきたいのですが、無茶苦茶だるくなったのでもう止めます(おぃおぃ)。
次からは通常通り、現状の JavaScript について語っていきます。