Respuestas:
La final
palabra clave tiene varios usos en Java. Se corresponde con las palabras clave sealed
y readonly
en C #, según el contexto en el que se utiliza.
Para evitar subclases (herencia de la clase definida):
Java
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
Prevenir la anulación de un virtual
método.
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Como señala Joachim Sauer, una diferencia notable entre los dos lenguajes aquí es que Java marca por defecto todos los métodos no estáticos como virtual
, mientras que C # los marca como sealed
. Por lo tanto, solo necesita usar la sealed
palabra clave en C # si desea detener la anulación adicional de un método que se ha marcado explícitamente virtual
en la clase base.
Para permitir que solo se asigne una variable una vez:
Java
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
Como nota al margen, el efecto de la readonly
palabra clave difiere del de la const
palabra clave en que la readonly
expresión se evalúa en tiempo de ejecución en lugar de tiempo de compilación , por lo que permite expresiones arbitrarias.
readonly
las variables miembro se pueden modificar en los constructores: pastebin.com/AzqzYGiA
Depende del contexto.
final
clase o método, el equivalente de C # essealed
.final
campo, el equivalente de C # esreadonly
.final
variable local o parámetro de método, no hay un equivalente directo de C #.For a final local variable or method parameter, there's no direct C# equivalent
una gran distinción.
const
solo se puede usar en tipos de valor. Hasta donde sé, no hay forma de hacer una constante efectiva para un tipo de referencia local.
Lo que falta a todos aquí es la garantía de Java de asignación definitiva para las variables miembro finales.
Para una clase C con la variable de miembro final V, cada ruta de ejecución posible a través de cada constructor de C debe asignar V exactamente una vez: no asignar V o asignar V dos o más veces dará como resultado un error.
La palabra clave de solo lectura de C # no tiene esa garantía: el compilador está más que feliz de dejar miembros de solo lectura sin asignar o permitirle asignarlos varias veces dentro de un constructor.
Entonces, final y readonly (al menos con respecto a las variables miembro) definitivamente no son equivalentes: final es mucho más estricto.
Como se mencionó, sealed
es un equivalente de final
para métodos y clases.
En cuanto al resto, es complicado.
Para los static final
campos, static readonly
es lo más cercano posible. Le permite inicializar el campo estático en un constructor estático, que es bastante similar al inicializador estático en Java. Esto se aplica tanto a las constantes (primitivas y objetos inmutables) como a las referencias constantes a objetos mutables.
El const
modificador es bastante similar para las constantes, pero no puede configurarlas en un constructor estático.
readonly
se puede utilizar. Sin embargo, no es igual: final
requiere exactamente una asignación incluso en constructor o inicializador.No hay un equivalente de C # para una final
variable local que yo sepa. Si se pregunta por qué alguien lo necesitaría: puede declarar una variable antes de un if-else, switch-case o algo así. Al declararlo final, usted impone que se asigne como máximo una vez.
Las variables locales de Java en general deben asignarse al menos una vez antes de leerse. A menos que la rama salte antes de leer el valor, se asigna una variable final exactamente una vez. Todo esto se verifica en tiempo de compilación. Esto requiere un código de buen comportamiento con menos margen para un error.
En resumen, C # no tiene un equivalente directo de final
. Si bien Java carece de algunas características agradables de C #, es refrescante para mí, principalmente como programador de Java, ver dónde C # no puede ofrecer un equivalente.
Clase de Java final y método final -> sellado. Variable miembro Java final -> solo lectura para constante de tiempo de ejecución, constante para constante de tiempo de compilación.
No hay equivalente para la Variable local final y el argumento del método final
Las constantes de C # se declaran utilizando la palabra clave const para las constantes de tiempo de compilación o la palabra clave de solo lectura para las constantes de tiempo de ejecución. La semántica de las constantes es la misma en los lenguajes C # y Java.