24

C#には、コードを大幅に簡素化する自動プロパティがあります。

public string Name { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }

Javaはこれだけのコードを記述しますが、次のようになります。

private String name;
private String middleName;
private String LastName;

public String Name(){
   return this.name;
}

etc..

Javaがこのようなものを実装していない特別な理由はありますか?

4

5 に答える 5

20

うん、それがないので。ことわざにあるように、すべての機能は実装されていない状態から始まります。

于 2010-08-07T04:37:30.190 に答える
18

特に下位互換性を気にする場合は、既存のプログラミング言語に新しい機能を追加するのはそれほど簡単ではありません。Sunは、Javaに新しい機能を追加することに常に細心の注意を払っています。なぜなら、新しい言語機能が何年にもわたって作成された何百万ものJavaプログラムを壊さないことを絶対に望んでいたからです。

したがって、これを言語に追加するだけの問題ではありません。追加したい新機能に微妙な下位互換性の問題がないかどうかを確認するには、慎重に考えて試してみる必要があります。

Javaで何らかの形でプロパティのサポートを追加する提案がありましたが、Java 7(次のバージョンが登場)では、これは検討中の機能ではないようです。

より簡潔なコードを記述できるようにするために、アノテーションを使用したJavaの一種の拡張機能であるProject Lombokを確認することをお勧めします(たとえば、フィールドのゲッターとセッターを自動的に生成できます)。

于 2010-08-07T05:34:44.533 に答える
3

自動プロパティは、プロパティに基づいて構築されます。

C#のプロパティは言語機能であり、Javaでは慣例です(getまたはsetで始まるメソッドは、コードについて話す人々によってプロパティと見なされることがよくありますが、コンパイラーにとってはfooまたはbarと同じです)。

.NETとそれに関連する言語は、多くの点でCOMに基づいています(場合によっては次のようになり、場合によっては、何らかの理由またはその他の人気のないCOMで意図的に何かを行わないこともあります)。

COMには、VBでは言語機能に裏打ちされたプロパティの概念があります(C ++では規則に裏打ちされています)。

VBの初期のバージョンは、特に他の場所から提供されたオブジェクトモデルへの基本的なプログラムアクセスを提供するために使用されたコンテキストで、フィールドと取得または設定するメソッドを区別するためにユーザーに提示されるオブジェクトモデルを簡素化することを目的としていました(おそらく追加の作業は、おそらく重要ではありません(.NETでは外部とは重要な点で異なりますが、構文的にプロパティとパブリックフィールドにアクセスすることは同じであると考えてください)。VBとCOM(およびその前のOLE)が成長したとき、それらは一緒に成長しました。

つまり、C#はJavaとC / C ++の継承を共有しますが、Javaが共有しない継承もあるため、プロパティはC#の作成者には良い考えのように見えますが、Javaには良い考えではありません。

編集:最初に私は言った:


個人的には、自動プロパティは、コードを単純化する方法ではなく、プロパティの欠陥に対する回避策であると思います。プロパティは構文的にはパブリックフィールドのように「見えます」が、完全ではありません(を使用DataBinder.Evalしてフィールドを取得してみてください)。プロパティが完全にパブリックであり、getterまたはsetterに追加機能がない場合(自動プロパティの場合)、パブリックフィールドが必要です(カプセル化はここでは議論の余地がなく、完全に公開されています-とにかくそれを渡します)が、フィールドとプロパティの違いはそれに対して機能します。


私はその声明を撤回します。フィールドをプロパティとまったく同じように作成するには、単純なPlain-Old-Data構造体のフィールドがプロパティのように機能する必要があり、パフォーマンスが低下します。概念的には、お互いにもっと似ていてほしいのですが、考えてみると(そして、ここのように「お待たせしました」と何度も悩まされることはなくなりました)、そのままの方がいいです。

于 2010-08-07T11:22:09.760 に答える
1

.netはJavaの後に登場し、その目標の1つはCOMとの相互運用でした。COMには、おそらくVBのようなプロパティがあったため、言語を相互運用可能にするために、.netはそれらを追加する必要がありました。(それで、彼らはかなり気の利いたアイデアでした。)

Javaにはそのような必要性はなく、その作成者はおそらく「=」の意味を汚染したり、関数呼び出しをメンバー変数のように見せたりしたくなかったでしょう。(彼らは-または少なくともある時点で-言語を可能な限りクリーンに保つことに大きな関心を持っていました。)代わりに、彼らのアプローチは、ゲッターとセッターの命名規則を指定したJavaBean仕様でした。仕様を知っているIDEは、設計目的で、ゲッターとセッターのビューを単一の「プロパティ」として多かれ少なかれ曖昧にする可能性があります。

于 2010-08-07T04:50:43.610 に答える
1

同じ理由で、C#2.0以下にはこれがありません。それは、言語機能というよりは、糖衣構文です。このような機能はどの言語にも追加できるものがたくさんありますが、なぜそれらがその言語ではないのかは誰にもわかりません。

于 2010-08-07T05:42:04.817 に答える