web-dev-qa-db-ja.com

Javaのゲッター/セッター

私は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に相当するものはありますか?

22
George Profenza

いいえ。 AS3のゲッターとセッターはECMAScriptのものです。 Javaでは、getVal()およびsetVal()スタイルの関数に悩まされています。

私はEclipseがこれらのタイプのものを自動生成するのを助けることができると思います...

20
zenazn

あなたの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;
  }
}
10
Stephan202

IDEに依存しない方法は、ゲッター、セッター、さらにequals()hashcode()を生成する注釈ベースのライブラリ Lombok を使用することです。コンパイラーではこれを行いますが、ソースファイルでは行いません。そのため、メソッドを見る必要はなく、それらを使用するだけです。

3
Nate Parsons

残念なことに、Javaには同等の言語レベルのサポートがありません。

Get *およびset *パターンは、Javaカルチャで確立されているため、強力なIDEサポートが見つかります(たとえば、Eclipseはあなたが自動的に)、そして最初にjsp(EL)用に作成された式言語を使用するもので作業している場合は、プロパティ表記を使用してゲッターとセッターにアクセスできます。

3
Daniel Martin

コードをより複雑にする以外は何もしないので、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

3
Peter Lawrey

Javaでは、オブジェクトの内部を公開せずに使用できる唯一のオプションは、例のように独自のゲッターとセッターを作成することです。

慣例では、変更されるフィールドの前にgetまたはsetを付加します。したがって、例のように、フィールドnameには、それぞれ対応するゲッターおよびセッターとしてgetNameおよびsetNameメソッドがあります。

2
coobird

また、セッターとゲッターを追加する前に、問題のオブジェクトの内部データを公開する理由を自問することをお勧めします。
この記事を読むことをお勧めします- http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

1
KingInk