OSTRACISM CO.

C#とObjective-CとJavaと...

GetterとSetter

 あるクラスのメンバ変数に外部から直接値を参照したり代入したりせずにメソッドを経由してアクセスする。JavaのBeansでGetterとSetterを言語仕様ではなく実装の規約として導入したことで知られるようになった。と思っているが概念としてはもっと古いかもしれない。
 メンバへの代入ですんでたところが、機能の変更や強化に伴いなんらかの処理をする必要が生じることはよくある。そういうときにGetterやSetterを使うことになる。
 とはいえ、最初から全ての変数にGetterやSetterを用意するのはあまりに冗長。必要になったら用意すれば良い程度に考える。
 C#やDではこのGetterとSetterを言語仕様として持っている。プロパティという名前だ。Objective-CとJavaには言語としてのサポートはない。運用でカバーしている。

C#

 例えば、GGG4WクラスのmenuSearch_Clickコールバックで、ボタンの表示文字列を変更するのに
this.btnSearch.Text = m_rmStrings.GetString("RS_STOP");
としている。右辺はリソースからの文字列の獲得。左辺はボタンのテキスト変数。このテキスト変数に値を入れると表示も変わることからこのbtnSearch.Textはメソッド呼び出しだとわかる。
 きっと
public string Text {
	get {
		...
	}
	set {
		...
	}
}
となっており、set時に値を入れるだけでなくなんらかの処理もなされていると考えられる。
 C#あるいは.NETは可能な限り代入であらゆることを表現できるようにしたいという方向で仕様が決まっているようだ。

Objective-C

 Objective-Cのクラス変数は外部から全くアクセスできない。よって、GetterとSetterを用意する以外に手がない。
@interface TGraphicSearch : NSObject {
	...
}
...
- (int)pixelNumber;
- (void)setPixelNumber:(int)value;
...
@end
 これは結構わずらわしい。Obejctive-CのCからのオブジェクト拡張部分はどうも純粋なOOPを性向しており、C的なフレキシブルさが感じられない。
 例えば、GGG4MクラスのmenuSearchAction コールバックで、ボタンの表示文字列を変更するのに
[btnSearch setTitle:NSLocalizedString(@"Stop", @"")];
としている。普通にメソッド。

Java

 JavaのBeansはGetterとSetterを言語仕様ではなく実装の規約として導入した。この点は後に(あるいはその当時も?)批判されている。
 例えば、GGG4JクラスのmenuSearchActionPerformedコールバックで、ボタンの表示文字列を変更するのに
btnSearch.setText(java.util.ResourceBundle.getBundle(m_bundlePath).getString("btnStop"));
としている。これはJButtonクラスのtextのSetterだが、ようは普通のメソッドだ。

2005.07.04
「インデックス」へ戻る

OSTRACISM CO.
OSTRA / Takeshi Yoneki