web-dev-qa-db-ja.com

(no)Javaのプロパティ?

だから、私は故意にJava n00bを最近まで維持し、私の最初の実際の露出は小さな衝撃をもたらしました:JavaはC#スタイルのプロパティを持っていません!

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

55
Ishmaeel

Beanプロパティ と呼ばれる、Javaのゲッターおよびセッター用の「標準」パターンがあります。基本的に、getで始まり、引数を取らず、値を返すメソッドは、メソッド名の残りの部分(小文字の開始文字)として指定されたプロパティのプロパティゲッターです。同様に、setは、1つの引数を持つ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();
63
Calum

誰も言及していないことに驚いています project lombok

はい、現在、Javaにはプロパティがありません。他にも不足している機能がいくつかあります。
しかし、幸いなことに、状況を改善しようとしている project lombok があります。また、毎日人気が高まっています。

そのため、ロンボクを使用している場合:

@Getter @Setter int awesomeInteger = 5;

このコードは、getAwesomeIntegersetAwesomeIntegerも生成します。つまり、 C#自動実装プロパティ と非常によく似ています。

ロンボクのゲッターとセッターに関する詳細情報を取得できます here
間違いなくチェックアウトする必要があります その他の機能 。私のお気に入りは:

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

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

興味がある場合は、詳細なリンクと情報について http://tech.puredanger.com/Java7#property を参照してください。

8
Cheekysoft

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

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

JVM上の他の言語(Groovyなど)では、C#に類似したオーバーライド可能なプロパティを取得します(例:

int foo

これは単純な.fooでアクセスされ、必要に応じてオーバーライドできるデフォルトのgetFooおよびsetFoo実装を活用します。

6
Hank Gay
public class Animal {

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

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

6
dantuch

「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());
    }
}
4
LEMUEL ADANE

Jeffrey Richter's book C#経由のCLR:(プロパティがJavaにまだ追加されていない理由だと思う)

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

JavaのほとんどのIDEは、必要に応じてgetterおよびsetterコードを自動的に生成します。多くの異なる規則があり、EclipseのようなIDEどちらを使用するかを選択でき、独自に定義することもできます。

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

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

3
Bill Michell

私のJava経験はそれほど高くないので、誰でも私を自由に修正できます。

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

public void setMyString(string myString) {
    // set it here
}
2
Mark Embling

私はJava 5/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 {
}

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

試してみて、便利だと思ったらメールを送ってください! -スコット

1

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

1
TK.

Java(C#で見つけることができるように)にプロパティキーワードはありません。1つのWordゲッター/セッターを使用する最も近い方法は、C++のようにすることです。

public class MyClass
{
    private int aMyAttribute;
    public MyClass()
    {
        this.aMyAttribute = 0;
    }
    public void mMyAttribute(int pMyAttributeParameter)
    {
        this.aMyAttribute = pMyAttributeParameter;
    }
    public int mMyAttribute()
    {
        return this.aMyAttribute;
    }
}
//usage :
int vIndex = 1;
MyClass vClass = new MyClass();
vClass.mMyAttribute(vIndex);
vIndex = 0;
vIndex = vClass.mMyAttribute();
// vIndex == 1
1
Patrick PIGNOL

Eclipseについて前述したように、統合開発環境(IDE)は多くの場合、アクセサメソッドを自動的に作成できます。

NetBeansを使用して行うこともできます。

クラスのアクセサメソッドを作成するには、クラスファイルを開き、ソースコードエディタの任意の場所を右クリックして、メニューコマンド[リファクタリング、フィールドのカプセル化]を選択します。ダイアログが開きます。 [すべて選択]をクリックし、[リファクタリング]をクリックします。ほら、

幸運を、

0
levteck