12

これが何度も議論されてきたことは知っていますが、なぜJava と C# の設計者がこれらの言語からこの機能を除外することを選択したのか、私にはよくわかりません。どのように回避策を講じるか (インターフェイス、クローン作成、またはその他の代替手段を使用) には興味がありませんが、決定の背後にある理論的根拠に興味があります。

言語設計の観点から、この機能が拒否されたのはなぜですか?

PS: C# は加算 (減算ではなく) アプローチで設計されているため、「省略」などの言葉を使用しています。ただし、これらの言語が設計される前に C++ に機能が存在していたため、このような言葉を使用しているため、プログラマーのツールボックスから削除されたという意味で省略されています。

4

5 に答える 5

15

このインタビューで、アンダースは次のように述べています

Anders Hejlsberg: はい。const に関しては、興味深いのは、「なぜ c​​onst がないのですか?」という不満もよく耳にするからです。この質問に暗示されているのは、「ランタイムによって強制される const がないのはなぜですか?」ということです。それは実際に人々が求めていることですが、彼らはそのようには言いません。

const が C++ で機能する理由は、それをキャストできるからです。それを捨てることができなければ、あなたの世界はつまらなくなるでしょう。const Bla を取るメソッドを宣言する場合、非 const Bla を渡すことができます。でも逆なら仕方ない。非 const Bla を取るメソッドを宣言する場合、const Bla を渡すことはできません。だから今、あなたは立ち往生しています。そのため、const ではないすべてのものの const バージョンが徐々に必要になり、最終的には影の世界になります。C++ では、このチェックが必要かどうかは純粋にオプションであるため、C++ では問題ありません。気に入らない場合は、constness を叩くことができます。

于 2009-01-27T10:58:20.837 に答える
7

主な理由は次のとおりです。

  • C++ でも、適切に強制することはできません (キャストできます)。
  • 一番下の単一の const は、コール ツリーで const のチェーン全体を強制できます。

どちらも問題になる可能性があります。しかし、特に 1 つ目: 保証できない場合、それは何の役に立つのでしょうか? より良いオプションは次のとおりです。

  • 不変型 (完全な不変性、またはポプシクル不変のいずれか)
于 2009-01-27T10:57:29.857 に答える
1

Javaに関しては、そのようなプロパティをどのように動作させますか? オブジェクトを不変にする手法はすでに存在しますが、これは間違いなくこれを達成するためのより良い方法であり、追加の利点があります。実際、状態を変更しないメソッドのみを実装するスーパークラス/スーパーインターフェースを宣言し、変更メソッドを実装するサブクラス/サブインターフェースを持つことで、const の動作をエミュレートできます。変更可能なクラスを書き込みメソッドのない class のインスタンスにアップキャストすることにより、他のコードは、特に変更可能なバージョンにキャストし直さない限り、オブジェクトを変更できません (これは をキャストすることと同じですconst)。

オブジェクトを厳密に不変にしたくない場合でも、本当に必要な場合 (これはお勧めしません)、ある種の「ロック」モードをオブジェクトに設定して、ロックが解除されたときにのみ変更できるようにすることができます。ロック/ロック解除メソッドをプライベートにするか、必要に応じて保護すると、ある程度のアクセス制御が得られます。または、メソッドがそれをパラメーターとして使用して変更することをまったく意図していない場合は、そのオブジェクトのコピーを渡すか、オブジェクト全体をコピーすると重量が大きすぎる場合は、必要なだけを含む他の軽量データ オブジェクトを使用します。情報。動的プロキシを使用してオブジェクトへのプロキシを作成し、ミューテーション メソッドの呼び出しをノーオペレーションにすることもできます。

基本的に、クラスが変更されるのを防ぐ方法はすでにたくさんあり、状況に最も適した方法を選択できます (ヒント: オブジェクトを自明にスレッドセーフにし、一般的に推論しやすくするため、可能な限り純粋な不変性を選択してください) )。これらの手法を改善する実装方法についての明白なセマンティクスはありませんconst。柔軟性に欠けるか、柔軟性がありすぎて役に立たないことを学ぶことは別のことです。

つまり、私が何かを見逃していない限り、それは完全に可能です. :-)

于 2009-01-27T11:11:56.380 に答える
1

彼らがそれを行った理由について、関係者は次のように述べています。

http://blogs.msdn.com/ericgu/archive/2004/04/22/118238.aspx http://blogs.msdn.com/slippman/archive/2004/01/22/61712.aspx レイモンドも言及チェン http://blogs.msdn.com/oldnewthing/archive/2004/04/27/121049.aspx

多言語システムでは、これは非常に複雑になります。

于 2009-01-27T10:58:31.507 に答える
0

Java には独自のバージョンの const があります。最後の。Joshua Bloch は、彼の「Effective Java 」で 、final キーワードを効果的に使用する方法について説明しています。(ちなみに、const は将来の不一致のために Java で予約されているキーワードです)

于 2009-01-27T13:01:45.893 に答える