Réponses:
Le final
mot-clé a plusieurs usages en Java. Il correspond à la fois aux mots clés sealed
et readonly
en C #, selon le contexte dans lequel il est utilisé.
Pour empêcher le sous-classement (héritage de la classe définie):
Java
public final class MyFinalClass {...}
C #
public sealed class MyFinalClass {...}
Empêcher le remplacement d'une virtual
méthode.
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C #
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Comme le souligne Joachim Sauer, une différence notable entre les deux langages ici est que Java par défaut marque toutes les méthodes non statiques comme virtual
, tandis que C # les marque comme sealed
. Par conséquent, vous n'avez besoin d'utiliser le sealed
mot clé en C # que si vous souhaitez arrêter de surcharger une méthode qui a été explicitement marquée virtual
dans la classe de base.
Pour autoriser une variable à être affectée une seule fois:
Java
public final double pi = 3.14; // essentially a constant
C #
public readonly double pi = 3.14; // essentially a constant
En remarque, l'effet du readonly
mot - clé diffère de celui du const
mot - clé dans la mesure où l' readonly
expression est évaluée au moment de l' exécution plutôt qu'au moment de la compilation , permettant ainsi des expressions arbitraires.
readonly
les variables membres peuvent être modifiées dans les constructeurs: pastebin.com/AzqzYGiA
Ça dépend du contexte.
final
classe ou une méthode, l' équivalent C # estsealed
.final
champ, l' équivalent C # estreadonly
.final
variable locale ou un paramètre de méthode, il n'y a pas d'équivalent C # direct.For a final local variable or method parameter, there's no direct C# equivalent
une énorme distinction.
const
ne peut être utilisé que sur des types de valeur. Pour autant que je sache, il n'y a aucun moyen de faire une constante efficace pour un type de référence local.
Ce que tout le monde manque ici, c'est la garantie de Java d'une affectation définitive pour les variables de membre final.
Pour une classe C avec la variable de membre final V, chaque chemin d'exécution possible à travers chaque constructeur de C doit assigner V une seule fois - faute d'attribuer V ou d'affecter V deux fois ou plus, une erreur se produira.
Le mot clé en lecture seule de C # n'a aucune garantie de ce type - le compilateur est plus qu'heureux de laisser les membres en lecture seule non affectés ou de vous permettre de les affecter plusieurs fois au sein d'un constructeur.
Ainsi, final et readonly (au moins en ce qui concerne les variables membres) ne sont certainement pas équivalents - final est beaucoup plus strict.
Comme mentionné, sealed
est un équivalent de final
pour les méthodes et les classes.
Quant au reste, c'est compliqué.
Pour les static final
champs, static readonly
c'est la chose la plus proche possible. Il vous permet d'initialiser le champ statique dans un constructeur statique, qui est assez similaire à l'initialiseur statique en Java. Cela s'applique à la fois aux constantes (primitives et objets immuables) et aux références constantes aux objets mutables.
Le const
modificateur est assez similaire pour les constantes, mais vous ne pouvez pas les définir dans un constructeur statique.
readonly
peut être utilisé. Ce n'est pas égal cependant - final
nécessite exactement une affectation, même dans le constructeur ou l'initialiseur.Il n'y a pas d'équivalent C # pour une final
variable locale à ma connaissance. Si vous vous demandez pourquoi quelqu'un en aurait besoin: vous pouvez déclarer une variable avant un if-else, un switch-case ou autre. En le déclarant définitif, vous faites en sorte qu'il soit attribué au plus une fois.
Les variables locales Java en général doivent être affectées au moins une fois avant d'être lues. À moins que la branche ne saute avant la lecture de la valeur, une variable finale est affectée exactement une fois. Tout cela est vérifié au moment de la compilation. Cela nécessite un code bien comporté avec moins de marge d'erreur.
En résumé, C # n'a pas d'équivalent direct de final
. Bien que Java manque de fonctionnalités intéressantes de C #, il est rafraîchissant pour moi, en tant que programmeur Java, de voir où C # ne parvient pas à fournir un équivalent.
Classe Java finale et méthode finale -> scellées. Variable membre Java final -> en lecture seule pour la constante d'exécution, const pour la constante de temps de compilation.
Aucun équivalent pour la variable locale finale et l'argument de méthode final
Les constantes C # sont déclarées à l'aide du mot clé const pour les constantes de temps de compilation ou du mot clé readonly pour les constantes d'exécution. La sémantique des constantes est la même dans les langages C # et Java.