C#におけるJavaのfinal
と同等のものは何ですか?
final
キーワードは、Javaではいくつかの使用法があります。使用されているコンテキストに応じて、C#の sealed
と readonly
の両方のキーワードに対応します。
サブクラス化(定義されたクラスからの継承)を防ぐには
Java
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
virtual
メソッドのオーバーライドを防止します。
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Joachim Sauer氏が指摘しているように、ここでの2つの言語の大きな違いは、Javaはデフォルトですべての非静的メソッドをvirtual
としてマークし、C#はsealed
としてマークするということです。したがって、基本クラスで明示的にsealed
とマークされているメソッドをさらにオーバーライドしたくない場合は、C#でvirtual
キーワードを使用するだけで済みます。
変数の割り当てを1回だけ許可するには
Java
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
注意として、readonly
キーワードの効果は、 const
キーワードの効果と異なり、readonly
式はコンパイル時ではなくランタイムで評価されます。任意の表現を許可します。
状況によって異なります。
final
クラスまたはメソッドの場合、 C#と同等のものはsealed
です。final
フィールドの場合、 C#と同等のものはreadonly
です。final
ローカル変数またはメソッドパラメータには、直接のC#に相当するものはありません。ここで全員が欠けているのは、最終メンバー変数に対する確実な代入のJavaによる保証です。
最終メンバー変数Vを持つクラスCの場合、Cのすべてのコンストラクターを通る可能なすべての実行パスは、Vを正確に1回割り当てる必要があります。
C#のreadonlyキーワードにはそのような保証はありません - コンパイラはreadonlyメンバを未割り当てのままにしておくか、コンストラクタ内で複数回割り当てることができて幸せです。
そのため、finalとreadonly(少なくともメンバー変数に関して)は絶対に同等ではありません - finalははるかに厳密です。
Javaクラスfinalとメソッドfinal - > sealed Javaメンバ変数final - >ランタイム定数はreadonly、コンパイル時定数はconst.
ローカル変数finalおよびメソッド引数finalに相当するものはありません
前述のように、sealed
はメソッドやクラスのfinal
と同等です。
残りは複雑です。
const
は同等と見なすことができます。readonly
を使用できますが、等しくはありません - final
は、コンストラクタ内でも1つの代入が必要です。まとめると、C#にはfinal
と直接同等のものはありません。 JavaにはC#のNice機能がいくつか欠けていますが、C#が同等の機能を提供できない場所を知ることは、ほとんどJavaプログラマーである私にとっては爽快です。
C#定数は、コンパイル時定数にはconstキーワード、ランタイム定数にはreadonlyキーワードを使用して宣言されます。定数の意味は、C#言語とJava言語の両方で同じです。
封印