ですから、私は最近までJava n00bを故意に保持してきましたが、最初の実際の露出は小さな衝撃をもたらしました。JavaにはC#スタイルのプロパティがありません。
わかりました、私はそれと一緒に暮らすことができます。ただし、1つのコードベースでJavaのプロパティゲッター/セッターコードを見たことがあることを誓うこともできますが、どこにあるのか思い出せません。それはどのように達成されましたか?そのための言語拡張はありますか?NetBeansか何かに関連していますか?
ですから、私は最近までJava n00bを故意に保持してきましたが、最初の実際の露出は小さな衝撃をもたらしました。JavaにはC#スタイルのプロパティがありません。
わかりました、私はそれと一緒に暮らすことができます。ただし、1つのコードベースでJavaのプロパティゲッター/セッターコードを見たことがあることを誓うこともできますが、どこにあるのか思い出せません。それはどのように達成されましたか?そのための言語拡張はありますか?NetBeansか何かに関連していますか?
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
実際に使用することもできます。has
get
public boolean isAwesome();
public boolean hasAwesomeStuff();
プロジェクトロンボクについて誰も言及していないことに驚いています
はい、現在 Java にはプロパティがありません。他にも欠けている機能がいくつかあります。
しかし幸いなことに、状況を改善しようとしているプロジェクト ロンボクがあります。こちらも日を追うごとに人気が高まっています。
したがって、ロンボクを使用している場合:
@Getter @Setter int awesomeInteger = 5;
このコードは生成され、同様に生成さgetAwesomeInteger
れsetAwesomeInteger
ます。したがって、 C# の自動実装プロパティに非常に似ています。
ロンボクのゲッターとセッターの詳細については、こちらを参照してください。他の機能
も
必ずチェックする必要があります。私のお気に入りは次のとおりです。
Lombok は IDE と十分に統合されているため、生成されたメソッドが存在するかのように表示されます (提案、クラスの内容、宣言とリファクタリングに移動)。
lombok の唯一の問題は、他のプログラマーがそれを知らない可能性があることです。コードをデロンボクすることはいつでもできますが、それは解決策ではなく回避策です。
「Java プロパティのサポート」は Java 7 で提案されましたが、言語には組み込まれませんでした。
興味がある場合は、 http://tech.puredanger.com/java7#propertyで詳細なリンクと情報を確認してください。
public class Animal {
@Getter @Setter private String name;
@Getter @Setter private String gender;
@Getter @Setter private String species;
}
これは C# プロパティのようなものです。http://projectlombok.org/です。
Bean の規則では、次のようなコードを記述します。
private int foo;
public int getFoo() {
return foo;
}
public void setFoo(int newFoo) {
foo = newFoo;
}
Groovy などの JVM 上の他の言語の一部では、C# に似たオーバーライド可能なプロパティが得られます。
int foo
これはシンプルでアクセスされ、必要に応じてオーバーライドできるデフォルトと実装を.foo
活用します。getFoo
setFoo
プロパティのように見せるために、「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());
}
}
Java 用のほとんどの IDE は、必要に応じてゲッター コードとセッター コードを自動的に生成します。さまざまな規則が多数あり、Eclipse のような IDE では、使用する規則を選択でき、独自の規則を定義することもできます。
Eclipse には、プロパティを getter と setter でラップできるようにする自動リファクタリングも含まれており、プロパティに直接アクセスするすべてのコードを変更して、getter や setter を使用できるようにします。
もちろん、Eclipse が変更できるのは、Eclipse が認識しているコードのみです。外部の依存関係は、このようなリファクタリングによって壊れる可能性があります。
Java の経験もそれほど高くないので、どなたでもお気軽に訂正してください。しかし、私の知る限り、一般的な慣習は次のような2つのメソッドを書くことです:
public string getMyString() {
// return it here
}
public void setMyString(string myString) {
// set it here
}
Jeffrey Richter の 著書CLR via C# から: (これらが、Java でプロパティがまだ追加されていない理由である可能性があると思います)
out
プロパティをまたはref
パラメータとしてメソッドに渡すことはできません。フィールドはできます。System.MarshalByRefObject
)、プロパティ メソッドの呼び出しは非常に遅くなるため、プロパティよりもメソッドを使用することをお勧めします。私の意見では、から派生したクラス
MarshalByRefObject
は決してプロパティを使用すべきではありません。System.DateTime
読み取り専用
プロパティがあります。Now
このプロパティをクエリするたびに、異なる値が返されます。これは間違いであり、Microsoft は Now をプロパティではなくメソッドにすることでクラスを修正できることを望んでいます。Environment
の
TickCount
プロパティは、この間違いの別の例です。これを支援するために、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 {
}
利用可能なサンプルは他にもたくさんあり、生成されたコードには実行時の依存関係はありません。
あなたがそれを試して、それが役に立つと思うならば、私に電子メールを送ってください!-スコット
Eclipse を使用している場合、内部属性の getter メソッドと setter メソッドを自動生成する機能があり、便利で時間の節約になるツールになります。