C ++でのconst参照の受け渡しにJavaで相当するものはありますか?
メソッドの署名に関して誤解を招く「constness」を除外していませんか?
6 に答える
いいえ、ありません。
Javaの「final」はC++の「const」と完全に同等ではありません。以下(最終変数の初期化の遅延)はJavaで機能します。
final double x;
int w = 1;
if (w > 2)
{
x = 0.5;
}
else
{
x = - 0.5;
}
ただし、「final」が「const」に置き換えられたC++では機能しません。
メソッド宣言の変数で「final」を使用すると、メソッド内で作成された匿名クラス内でこの変数を使用できるため、Javaで役立ちます。
PS。私は最初、Javaに「const」がないことに失望しましたが、後に「final」で生きることを学びました。
PS2。このスレッドでリンクされているJava用語集(http://mindprod.com/jgloss/immutable.html)には、1つ間違った点があります。いいえ、最終変数がその値を変更しないという100%の保証が与えられていません。
1)「未定義」から「定義済み」に変更されますが、初期化前に参照するとコンパイラが通知します
2)Linuxでは、doubleはレジスタに格納されている場合は80ビットの精度ですが、メモリに格納されている場合は64ビットの精度です。最後のdouble変数がレジスタからプッシュされると、切り捨てられて値が変更されます。Joel Spolskyが言うように、「抽象化によってリークが発生しました」。
Javaには、C++のconstの概念のようなものはありません。.NETもそうではないことに注意するのは興味深いですが、これはいくつかの論点です。その理由は次のとおりです。
- 理解しやすい構文を取得するのはかなりトリッキーになります(IMO)-可変StringBuilderのconstリストとconstStringBuilderなどの可変リストの違いを区別するのは困難です。(C ++では確かに難しいと感じましたが、それは練習不足が原因である可能性があります。)
- 私は、管理された言語で恒常性を捨てることを許可することは受け入れられないだろうと強く疑っています。それは全体の穀物に反するでしょう。多くの場合、それによって作業が難しくなる可能性があります。
- 実行時に一定性に関する情報を伝達すること(それが流される可能性を回避するため)は、パフォーマンスの観点から困難および/または費用がかかる可能性があります
- Java(および.NET)は過去に恒常性を持っていなかったため、ゲームの後半に導入することは非常に困難です-すべての一般的なライブラリがJavaをサポートしない限り(そしてすべてのステップで正しく理解しない限り)、厄介なミッシュマッシュになってしまいます、実際、2つのライブラリを使用する必要がある場合は、完全に機能しない可能性があります。一方はconstnessを認識せず、もう一方はconst値のみを提供します。
ところで: Javaにはキーワードとしてconstがありますが、どこでも使用できません。
上記のように、Javaにはconstはありません。しかし、Javaで同じ結果に「近い」を達成したい場合は、
public static final Object x = somedata;
これにより、その時点でデータが設定され、抽象化リークなどがなくなるため、可能な限り同等のデータが得られます。
Javaでこれを達成するには、これを参照してください: Javaの 不変オブジェクト
に最も近い Javaconst
は ですfinal
。
void func(final SomeClass x) {
// The following causes a compiler error
x = ...;
// The following works. If you don't want it to, then you have to make
// somevar final or write a getter (but not a setter) for it in SomeClass.
x.somevar = ...;
}