web-dev-qa-db-ja.com

Javaゲッターとセッター

Javaでゲッターとセッターを作成するためのより良い標準的な方法はありますか?

各変数のゲッターとセッターを明示的に定義する必要があるのは非常に冗長です。より良い標準的な注釈アプローチはありますか?

Springにはこのようなものがありますか?

C#にもプロパティがあります。

56
Verhogen

「標準」とみなすかどうかはわかりませんが、 Project Lombok はこの問題に対処します。アノテーションを使用して、Javaの冗長性の多くを置き換えます。

一部の人々は、GroovyやScalaなどの代替言語であるJava兄弟言語を探しています。JSRが「標準化された」方法を理解するまでに、数年かかると思いますJava適切。

66
Carl Smotricz

Eclipseには、他の多くのIDEが行うように、これらを自動生成するコンテキストメニューオプションがあります。

19
Ascalonian

Eclipse固有ではない注釈をいくつか作成しました。

http://code.google.com/p/javadude/wiki/Annotations を参照してください

例えば:

package sample;

import com.javadude.annotation.Bean;
import com.javadude.annotation.Property;
import com.javadude.annotation.PropertyKind;

@Bean(properties={
    @Property(name="name"),
    @Property(name="phone", bound=true),
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
}) 
public class Person extends PersonGen {
}

私の注釈はスーパークラスを生成します。 Lombokはコンパイルされている実際のクラスを変更すると思います(公式にはSunによってサポートされておらず、壊れる可能性があります-それがどのように機能するかは間違っている可能性がありますが、私が見たことに基づいて彼らはそれをしなければなりません)

楽しい! -スコット

6

@RooJavaBeanアノテーションを持つSpring Rooプロジェクトもあります。また、@ RooToStringと@RooHashCodeEqualsなどがあります。適切な方法でAspectJファイルをバックグラウンドで生成します。

3

ほとんどのIDEには、コードを生成するためのショートカットがあります(例Eclipse:右クリック->ソース->ゲッターとセッターの生成) 、これはおそらくあなたが探している答えではないことを理解していますが。

いくつかのIOCフレームワークは、タペストリーIOCや最新のSpringなど、フレームワークのコンテキストで使用できるようにプロパティに注釈を付けることができますが、この使用は、フレームワーク)

3
Joel

このテーマに関する興味深い記事を次に示します。 http://cafe.elharo.com/Java/why-Java-doesnt-need-properties-it-already-has-them/

プロパティはショートカットだと思いますが、それは本当の重要な機能というよりは小さな機能です

3
Jerome Cance

ゲッター/セッターは冗長であることに同意します。 Project Lombok は、他の人から示唆されているように、適切な答えがあります。それ以外の場合は、IDEの機能を使用してそれらを生成できます。

3
fastcodejava

可能な代替手段として、 Scala を試しましたか? Javaバイトコードにコンパイルされ、Javaプログラマーとしての生活を楽にすることができる興味深いショートカットがたくさんあります。

インスタンスのプロパティ:

case class Person(var name:String, 
                  var age:Int);
val p = Person("John", 4)
p.name
p.name = "Charlie"
p.name

そして出力:

defined class Person
p: Person = Person(John,4)
res7: String = John
res8: String = Charlie
2
Martin Wickman

Netbeansでは、ゲッター/セッターを置き換える場所にgetまたはsetと入力し、オートコンプリート(Ctrl + Space)を呼び出すだけで、ゲッターまたはセッターを生成するオプションが提供されます。また、コンストラクタを生成するオプションも提供します。

2
monksy

言語の一部であるより良い方法はありません。「プロパティ」キーワードのようなものはありません。

他の人々が言及したように、1つの代替案は、IDEを使用してそれらを生成することです。別の、これを必要とする多くののオブジェクトがある場合、基本クラスを取得し、ゲッターとセッターを含むラッパーを生成する独自のコード生成ツール。

また、変数をパブリックメンバーとして単純に公開することもできます。ただし、検証ロジックを追加することにした場合、これはおそらくあなたを傷つけるために戻ってくるでしょう。

ただし、最後に考えたのは、クラスを単にデータの転送に使用しない限り、おそらく内部状態を公開すべきではないということです。 IMO、ゲッターとセッターを使用した「動作」クラスはコードの匂いです。

2
kdgregory

次のようなものを試してください:

@Getter @Setter private int age = 10;

以下の詳細情報:

https://projectlombok.org/features/GetterSetter

2
Akash Yellappa

ええ、あなたはちょっと運が悪いです。 Groovyはそれらを自動的に生成しますが、標準Javaではサイコロは生成しません。 Eclipseを使用している場合、hashCode()およびequals()関数を生成するだけでなく、 かなり簡単に生成 を実行できます。

1
TheBigS

それがIDEの仕事で、ゲッター/セッターとして繰り返し冗長コードを生成します

0
user225486

IDEを使用して生成し、お持ちのゲッター/セッターの量を最小限に抑えるようにしてください。

プロパティのC#構文が好きです。きれいできれいだと思います。

0
Ravi Wallau

1つの選択肢は、パブリックフィールドをそれほど恐れないことです。取得および設定時に内部で検証や追加作業を行わないことがわかっている単純なクラスの場合、パブリックフィールドは定型文が少なくて済み、構文的に優れており、より効率的です。

0
dsimcha

Emacsを使用する場合、これを行うemacsマクロを定義できる場合があります。 emacsの達人はそこにいますか? :)

0
Larry Watanabe