61

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

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

春にはこんなものがありますか?

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

4

17 に答える 17

69

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

GroovyやScalaなどの代替Java兄弟言語を検討している人もいます。JSRがJavaでこれを「修正」するための「標準化された」方法を理解するまでには、たとえあったとしても、数年かかるのではないかと思います。

于 2009-12-15T13:11:08.977 に答える
19

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

于 2009-12-15T13:10:10.400 に答える
6

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によって公式にサポートされておらず、壊れている可能性があります-動作について間違っている可能性がありますが、私が見たものに基づいて、彼らはそれをしているに違いありません)

楽しみ!-スコット

于 2009-12-22T18:50:48.533 に答える
3

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

一部のIOCフレームワークでは、タペストリーIOCや最新のSpringなど、フレームワークのコンテキストで使用できるようにプロパティに注釈を付けることができます(ただし、この使用はフレームワークでの使用に制限されています)

于 2009-12-15T13:10:39.010 に答える
3

この件に関する興味深い記事は次のとおりです。 http://cafe.elharo.com/java/why-java-doesnt-need-properties-it-already-has-them/

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

于 2009-12-15T13:11:42.330 に答える
3

可能な代替手段として、 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
于 2009-12-15T13:52:43.013 に答える
3

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

于 2014-05-15T20:11:04.700 に答える
3

ゲッター/セッターが冗​​長であることに同意します。他の人が示唆しているように、プロジェクトロンボク には良い答えがあります。それ以外の場合は、IDE の機能を使用してそれらを生成できます。

于 2009-12-22T20:29:18.537 に答える
2

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

于 2009-12-15T13:13:17.070 に答える
2

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

他の人が言及したように、IDE を使用してそれらを生成するという 1 つの代替手段があります。もう 1 つは、これを必要とするオブジェクトが多数ある場合は、基本クラスを受け取り、getter と setter を含むラッパーを生成する独自のコード生成ツールを作成することです。

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

ただし、最後の考えとして、クラスが単にデータを転送するために使用されない限り、おそらく内部状態を公開すべきではありません。IMO、ゲッターとセッターを持つ「動作」クラスはコードの匂いです。

于 2009-12-15T13:14:39.093 に答える
1

ええ、あなたはちょっと運が悪いです。Groovyはそれらを生成しますが、標準のJavaにはサイコロはありません。Eclipseを使用すると、hashCode()関数とequals()関数を生成するだけでなく、非常に簡単に生成できます。

于 2009-12-15T13:10:49.413 に答える
0

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

于 2009-12-22T18:54:02.203 に答える
0

これは、反復的な冗長コードを getter/setter として生成する IDE の作業です。

于 2009-12-15T14:14:20.553 に答える
0

IDE を使用して生成し、getter/setter の量を最小限に抑えるようにしてください。不変性の追加の利点が得られる可能性があります。

私はプロパティの C# 構文が好きです。きれいでクリーンで、非常にクリーンだと思います。

于 2009-12-16T05:01:09.400 に答える
0

まあ、1 つのオプションは、パブリック フィールドをそれほど恐れないことです。get および set の内部で検証や余分な作業を行うことがないことがわかっている単純なクラスの場合、パブリック フィールドは必要なボイラープレートが少なく、構文的に優れており、より効率的です。

于 2009-12-16T05:08:56.807 に答える