Respuestas:
La finalpalabra clave tiene varios usos en Java. Se corresponde con las palabras clave sealedy readonlyen 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 virtualmé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 sealedpalabra clave en C # si desea detener la anulación adicional de un método que se ha marcado explícitamente virtualen 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 readonlypalabra clave difiere del de la constpalabra clave en que la readonlyexpresión se evalúa en tiempo de ejecución en lugar de tiempo de compilación , por lo que permite expresiones arbitrarias.
readonlylas variables miembro se pueden modificar en los constructores: pastebin.com/AzqzYGiA
Depende del contexto.
finalclase o método, el equivalente de C # essealed .finalcampo, el equivalente de C # esreadonly .finalvariable 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# equivalentuna gran distinción.
constsolo 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ó, sealedes un equivalente de finalpara métodos y clases.
En cuanto al resto, es complicado.
Para los static finalcampos, static readonlyes 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 constmodificador es bastante similar para las constantes, pero no puede configurarlas en un constructor estático.
readonlyse puede utilizar. Sin embargo, no es igual: finalrequiere exactamente una asignación incluso en constructor o inicializador.No hay un equivalente de C # para una finalvariable 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.