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