56

ですから、私は最近までJava n00bを故意に保持してきましたが、最初の実際の露出は小さな衝撃をもたらしました。JavaにはC#スタイルのプロパティがありません。

わかりました、私はそれと一緒に暮らすことができます。ただし、1つのコードベースでJavaのプロパティゲッター/セッターコードを見たことがあることを誓うこともできますが、どこにあるのか思い出せません。それはどのように達成されましたか?そのための言語拡張はありますか?NetBeansか何かに関連していますか?

4

14 に答える 14

64

Java には、 Bean プロパティと呼ばれるゲッターとセッターの「標準」パターンがあります。基本的に、引数を取らずに値を返す で始まるすべてのメソッドgetは、残りのメソッド名 (小文字の開始文字) として名前が付けられたプロパティのプロパティ ゲッターです。同様setに、単一の引数を持つ void メソッドのセッターを作成します。

例えば:

// Getter for "awesomeString"
public String getAwesomeString() {
  return awesomeString;
}

// Setter for "awesomeString"
public void setAwesomeString( String awesomeString ) {
  this.awesomeString = awesomeString;
}

ほとんどの Java IDE は、要求すればこれらのメソッドを生成します (Eclipse では、カーソルをフィールドに移動してCtrl-を押し1、リストからオプションを選択するだけです)。

価値があるのは、読みやすさのために、次のように、ブール型のプロパティの代わりにis実際に使用することもできます。hasget

public boolean isAwesome();

public boolean hasAwesomeStuff();
于 2008-09-16T09:00:15.590 に答える
34

プロジェクトロンボクについて誰も言及していないことに驚いています

はい、現在 Java にはプロパティがありません。他にも欠けている機能がいくつかあります。
しかし幸いなことに、状況を改善しようとしているプロジェクト ロンボクがあります。こちらも日を追うごとに人気が高まっています。

したがって、ロンボクを使用している場合:

@Getter @Setter int awesomeInteger = 5;

このコードは生成され、同様に生成さgetAwesomeIntegersetAwesomeIntegerます。したがって、 C# の自動実装プロパティに非常に似ています。

ロンボクのゲッターとセッターの詳細については、こちらを参照してください。他の機能
も 必ずチェックする必要があります。私のお気に入りは次のとおりです。

Lombok は IDE と十分に統合されているため、生成されたメソッドが存在するかのように表示されます (提案、クラスの内容、宣言とリファクタリングに移動)。
lombok の唯一の問題は、他のプログラマーがそれを知らない可能性があることです。コードをデロンボクすることはいつでもできますが、それは解決策ではなく回避策です。

于 2013-08-28T19:47:01.413 に答える
11

「Java プロパティのサポート」は Java 7 で提案されましたが、言語には組み込まれませんでした。

興味がある場合は、 http://tech.puredanger.com/java7#propertyで詳細なリンクと情報を確認してください。

于 2008-09-16T10:20:40.967 に答える
6
public class Animal {

    @Getter @Setter private String name;
    @Getter @Setter private String gender;
    @Getter @Setter private String species;
}

これは C# プロパティのようなものです。http://projectlombok.org/です。

于 2013-08-28T19:45:00.173 に答える
6

Bean の規則では、次のようなコードを記述します。

private int foo;
public int getFoo() {
    return foo;
}
public void setFoo(int newFoo) {
    foo = newFoo;
}

Groovy などの JVM 上の他の言語の一部では、C# に似たオーバーライド可能なプロパティが得られます。

int foo

これはシンプルでアクセスされ、必要に応じてオーバーライドできるデフォルトと実装を.foo活用します。getFoosetFoo

于 2008-09-16T08:59:58.477 に答える
4

プロパティのように見せるために、「get」および「set」プレフィックスは必要ない場合があります。次のようにすることができます。

public class Person {
    private String firstName = "";
    private Integer age = 0;

    public String firstName() { return firstName; } // getter
    public void firstName(String val) { firstName = val; } // setter

    public Integer age() { return age; } // getter
    public void age(Integer val) { age = val; } //setter

    public static void main(String[] args) {
        Person p = new Person();

        //set
        p.firstName("Lemuel");
        p.age(40);

        //get
        System.out.println(String.format("I'm %s, %d yearsold",
            p.firstName(),
            p.age());
    }
}
于 2015-01-28T02:37:12.743 に答える
3

Java 用のほとんどの IDE は、必要に応じてゲッター コードとセッター コードを自動的に生成します。さまざまな規則が多数あり、Eclipse のような IDE では、使用する規則を選択でき、独自の規則を定義することもできます。

Eclipse には、プロパティを getter と setter でラップできるようにする自動リファクタリングも含まれており、プロパティに直接アクセスするすべてのコードを変更して、getter や setter を使用できるようにします。

もちろん、Eclipse が変更できるのは、Eclipse が認識しているコードのみです。外部の依存関係は、このようなリファクタリングによって壊れる可能性があります。

于 2008-09-16T09:03:13.290 に答える
2

Java の経験もそれほど高くないので、どなたでもお気軽に訂正してください。しかし、私の知る限り、一般的な慣習は次のような2つのメソッドを書くことです:

public string getMyString() {
    // return it here
}

public void setMyString(string myString) {
    // set it here
}
于 2008-09-16T08:58:21.803 に答える
2

Jeffrey Richter の 著書CLR via C# から: (これらが、Java でプロパティがまだ追加されていない理由である可能性があると思います)

  • プロパティ メソッドは例外をスローする場合があります。フィールド アクセスで例外がスローされることはありません。
  • outプロパティをまたはrefパラメータとしてメソッドに渡すことはできません。フィールドはできます。
  • プロパティ メソッドの実行には時間がかかる場合があります。フィールド アクセスは常にすぐに完了します。プロパティを使用する一般的な理由は、スレッドの同期を実行することです。これにより、スレッドが完全に停止する可能性があるため、スレッドの同期が必要な場合はプロパティを使用しないでください。そのような状況では、方法が優先されます。また、クラスにリモートでアクセスできる場合 (たとえば、クラスが から派生している場合 System.MarshalByRefObject)、プロパティ メソッドの呼び出しは非常に遅くなるため、プロパティよりもメソッドを使用することをお勧めします。私の意見では、から派生したクラス MarshalByRefObjectは決してプロパティを使用すべきではありません。
  • 続けて複数回呼び出された場合、プロパティ メソッドは毎回異なる値を返すことがあります。フィールドは毎回同じ値を返します。このクラスには、現在の日付と時刻を返すSystem.DateTime読み取り専用 プロパティがあります。Nowこのプロパティをクエリするたびに、異なる値が返されます。これは間違いであり、Microsoft は Now をプロパティではなくメソッドにすることでクラスを修正できることを望んでいます。EnvironmentTickCountプロパティは、この間違いの別の例です。
  • プロパティ メソッドは、目に見える副作用を引き起こす可能性があります。フィールドアクセスは決してしません。つまり、型のユーザーは、その型で定義されたさまざまなプロパティを、その型のさまざまな動作に気付かずに、任意の順序で設定できる必要があります。
  • プロパティ メソッドは、追加のメモリを必要とするか、実際にはオブジェクトの状態の一部ではない何かへの参照を返す場合があるため、返されたオブジェクトを変更しても元のオブジェクトには影響しません。フィールドを照会すると、元のオブジェクトの状態の一部であることが保証されているオブジェクトへの参照が常に返されます。コピーを返すプロパティを操作すると、開発者が非常に混乱する可能性があり、この特性はドキュメント化されていないことがよくあります。
于 2013-12-26T08:56:17.487 に答える
1

これを支援するために、Java5/6アノテーションとアノテーションプロセッサをリリースしています。

http://code.google.com/p/javadude/wiki/Annotationsをチェックしてください

ドキュメントは今のところ少し軽いですが、quickrefはアイデアを広める必要があります。

基本的に、ゲッター/セッター(および他の多くのコード生成オプション)を使用してスーパークラスを生成します。

サンプルクラスは次のようになります

@Bean(properties = {
    @Property(name="name", bound=true),
    @Property(name="age,type=int.class)
})
public class Person extends PersonGen {
}

利用可能なサンプルは他にもたくさんあり、生成されたコードには実行時の依存関係はありません。

あなたがそれを試して、それが役に立つと思うならば、私に電子メールを送ってください!-スコット

于 2008-09-16T14:21:17.080 に答える
1

Eclipse を使用している場合、内部属性の getter メソッドと setter メソッドを自動生成する機能があり、便利で時間の節約になるツールになります。

于 2008-09-16T08:59:24.843 に答える