私はJavaを使い始めたばかりですが、OOP ActionScript 3の経験があるため、知っているものに依存して移行しようとしています。
ActionScript 3では、getおよびsetキーワードを使用してゲッターとセッターを作成できます。つまり、クラスにメソッドを作成し、そのクラスのインスタンスのプロパティを通じてデータにアクセスします。複雑に聞こえるかもしれませんが、そうではありません。次に例を示します。
class Dummy{
private var _name:String;
public function Dummy(name:String=null){
this._name = name;
}
//getter
public function get name():String{
return _name;
}
//setter
public function set name(value:String):void{
//do some validation if necessary
_name = value;
}
}
そして、私はオブジェクトのname
に次のようにアクセスします:
var dummy:Dummy = new Dummy("fred");
trace(dummy.name);//prints: fred
dummy.name = "lolo";//setter
trace(dummy.name);//getter
Javaではどうすればよいでしょうか。
パブリックフィールドをいくつか持つことは問題外です。メソッドの前でgetとsetを使用するこの規則があることに気づきましたが、これは問題ありません。
例えば、
class Dummy{
String _name;
public void Dummy(){}
public void Dummy(String name){
_name = name;
}
public String getName(){
return _name;
}
public void setName(String name){
_name = name;
}
}
クラスのインスタンスからフィールドとしてプライベートフィールドにアクセスする場合のように、JavaにActionScript 3のgetter/setterに相当するものはありますか?
いいえ。 AS3のゲッターとセッターはECMAScriptのものです。 Javaでは、getVal()およびsetVal()スタイルの関数に悩まされています。
私はEclipseがこれらのタイプのものを自動生成するのを助けることができると思います...
あなたのJavaコードは結構ですが、あなたがしたい場合を除いて、_name
プライベート。
Javaには、AS3の例のようにgetおよびsetキーワードがありません。申し訳ありませんが、あなたが得ているものよりも良くなりませんすでにやっています。
修正されたコード:
class Dummy {
private String _name;
public void Dummy() {}
public void Dummy(String name) {
setName(name);
}
public String getName() {
return _name;
}
public void setName(String value) {
_name = value;
}
}
IDEに依存しない方法は、ゲッター、セッター、さらにequals()
とhashcode()
を生成する注釈ベースのライブラリ Lombok を使用することです。コンパイラーではこれを行いますが、ソースファイルでは行いません。そのため、メソッドを見る必要はなく、それらを使用するだけです。
残念なことに、Javaには同等の言語レベルのサポートがありません。
Get *およびset *パターンは、Javaカルチャで確立されているため、強力なIDEサポートが見つかります(たとえば、Eclipseはあなたが自動的に)、そして最初にjsp(EL)用に作成された式言語を使用するもので作業している場合は、プロパティ表記を使用してゲッターとセッターにアクセスできます。
コードをより複雑にする以外は何もしないので、getterやsetterは使用しないことを検討します。以下は、getterまたはsetterを使用しない例です。
class Dummy {
public String name;
public Dummy(String name) { this.name = name; }
}
Dummy dummy = new Dummy("fred");
System.out.println(dummy.name);//getter, prints: fred
dummy.name = "lolo";//setter
System.out.println(dummy.name);//getter, prints: lolo
IMHO必要以上に複雑にしないでください。多くの場合、複雑さを追加すると問題が発生します You-Aint-Gonna-Need-It
Javaでは、オブジェクトの内部を公開せずに使用できる唯一のオプションは、例のように独自のゲッターとセッターを作成することです。
慣例では、変更されるフィールドの前にget
またはset
を付加します。したがって、例のように、フィールドname
には、それぞれ対応するゲッターおよびセッターとしてgetName
およびsetName
メソッドがあります。
また、セッターとゲッターを追加する前に、問題のオブジェクトの内部データを公開する理由を自問することをお勧めします。
この記事を読むことをお勧めします- http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html