C# vs Java Enum (pour ceux qui sont nouveaux à C#)
J'ai été à la programmation en Java pour un certain temps et viens de recevoir jeté sur un projet qui est entièrement écrit en C#. Je suis en train de monter à la vitesse en C#, et a remarqué des enums utilisée dans plusieurs endroits dans mon nouveau projet, mais à première vue, C#'s enums semblent être plus simpliste que le Java 1.5+ mise en œuvre. Quelqu'un peut-il énumérer les différences entre C# et Java enums, et comment surmonter les différences? (Je ne veux pas commencer une langue de flamme de guerre, je veux juste savoir comment faire certaines choses en C# que j'ai utilisé pour faire en Java). Par exemple, quelqu'un pourrait-il poster un C# contrepartie de Soleil célèbres de la Planète enum exemple?
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7),
PLUTO (1.27e+22, 1.137e6);
private final double mass; //in kilograms
private final double radius; //in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double mass() { return mass; }
public double radius() { return radius; }
//universal gravitational constant (m3 kg-1 s-2)
public static final double G = 6.67300E-11;
public double surfaceGravity() {
return G * mass / (radius * radius);
}
public double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
}
//Example usage (slight modification of Sun's example):
public static void main(String[] args) {
Planet pEarth = Planet.EARTH;
double earthRadius = pEarth.radius(); //Just threw it in to show usage
//Argument passed in is earth Weight. Calculate weight on each planet:
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight/pEarth.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
//Example output:
$ java Planet 175
Your weight on MERCURY is 66.107583
Your weight on VENUS is 158.374842
[etc ...]
- Je ne peux pas prendre le crédit pour cela. Il s'agit de Sun (Oracle): docs.oracle.com/javase/tutorial/java/javaOO/enum.html
Vous devez vous connecter pour publier un commentaire.
Les énumérations dans le CLR sont tout simplement nommé constantes. Le type sous-jacent doit être intégrale. En Java, une énumération est plus comme une instance nommée de type. Ce type peut être assez complexe et que votre exemple montre - contenir plusieurs champs de différents types.
À port l'exemple de C#, je voudrais juste changer l'énumération en est immuable de la classe et de l'exposer static readonly instances de cette classe:
public static IEnumerable<Planet> Values
, quelque chose commeprivate static Plan[] values = {VIP, CHEAP, MEDIUM, D_PLAN};
. Il va alors se rapprocher de l'enum de Java (vous pouvez avoir de la longueur et de l'accès à chaque enum avec un index)var p = "Earth"; var enum = (Planet)p;
.enum
peut être null. Je pense queclass
est plus l'équivalent de ce point de vue.En C#, vous pouvez définir les méthodes d'extension sur les enums, et de ce fait, certaines des fonctionnalités manquantes.
Vous pouvez définir
Planet
comme un enum et ont aussi des méthodes d'extension équivalente àsurfaceGravity()
etsurfaceWeight()
.J'ai utilisé des attributs personnalisés comme suggéré par Mikhail, mais la même chose pourrait être réalisé à l'aide d'un Dictionnaire.
En C# attributs peuvent être utilisés avec des enums. Bon exemple de programmation de modèle avec la description détaillée est ici (Codeproject)
Edit: cette question a été récemment posée à nouveau et répondit Jon Skeet: Ce qui est l'équivalent de Java enum en C#?
Intérieure privée les classes en C# - pourquoi ne sont-ils pas utilisés le plus souvent?
Edit 2: voir le accepté de répondre à qui s'étend cette approche dans un très brillante façon!
Java les énumérations sont en fait plein des classes qui peuvent avoir un constructeur privé et des méthodes, etc, alors que C# enums sont tout juste d'être nommé entiers. OMI Java de la mise en œuvre est de loin supérieure.
Cette page devrait vous aider beaucoup à apprendre tout en c# en provenance d'un camp java. (Le lien pointe vers les différences sur les énumérations (défiler vers le haut /vers le bas pour d'autres choses)
FOO = 0
qui est plus facile à utiliser dans les outils ORM (pas de risques d'erreursordinal()
d'utilisation nécessaire). En outre, C# prend en charge au niveau du bit énumérations qui sont souvent très utiles, surtout en combinaison avecEntityFramework
. Java devraient étendre leur option pour leur permettre d'être lié à des nombres entiers de trop. Ensuite, ils serait supérieure 🙂Quelque chose comme cela, je pense que:
Ou de combiner les constantes dans le
Planet
classe comme ci-dessusVoici une autre idée intéressante, qui s'occupe de la coutume de comportement disponibles en Java. Je suis venu avec l'suivantes
Enumeration
de la classe de base:Il y a un paramètre de type fondamentalement juste si l'ordinal nombre de fonctionner correctement à travers les différents dérivés des énumérations. Jon Skeet est
Operator
exemple de sa réponse à une autre question (http://stackoverflow.com/questions/1376312/whats-the-equivalent-of-javas-enum-in-c) ci-dessus devient alors:Cela donne quelques avantages.
string
etint
qui rend les instructions switch possibleSystem.Enum
peut être ajouté à la base de l'Énumération de la classe pour permettre les mêmes fonctionnalités.Un enum de Java est sucre syntaxique pour présenter les énumérations dans un OO manière. Ils sont des classes abstraites extension de la Enum class en Java, et chaque valeur d'enum, c'est comme un static final de l'instance publique de la mise en œuvre d'enum classe. Regardez les classes générées, et pour un enum "Foo" avec 10 valeurs, vous verrez "Foo$1" par "Foo$10" classes générées.
Je ne sais pas C#, cependant, je ne peux que spéculer qu'un enum dans cette langue est plus traditionnel, enum en C style de langues. Je vois de une rapide recherche sur Google qu'ils peuvent contenir plusieurs valeurs cependant, ils sont probablement mises en œuvre de manière similaire, mais avec beaucoup plus de restrictions que ce que le compilateur Java permet.
Java les énumérations permettent facile typesafe conversions à partir du nom à l'aide de l'généré par le compilateur valueOf méthode, c'est à dire
L'équivalent pour un raw enum en C# est plus prolixe:
Toutefois, si vous allez en bas de la route sugegsted par Kent, vous pouvez facilement mettre en œuvre un
ValueOf
méthode dans votre enum class.Je soupçonne enum en C# sont juste des constantes internes à la CLR, mais pas familier avec eux. J'ai décompilé certaines classes en Java et je peux dire que vous voulez les Énumérations sont une fois que vous convertissez.
Java fait quelque chose de sournois. Il traite l'énumération de la classe comme une classe normale avec, aussi près que je peux comprendre, à l'aide de beaucoup de macros lors de la référence à des valeurs enum. Si vous avez un cas relevé dans une classe Java qui utilise des enums, il remplace l'énumération des références à des entiers. Si vous avez besoin d'aller à la chaîne, il crée un tableau de chaînes de caractères indexés par un nombre ordinal qu'il utilise dans chaque classe. Je le soupçonne d'enregistrer sur la boxe.
Si vous téléchargez ce decompiler vous obtiendrez de voir comment il crée sa classe un intègre. Assez fascinant, pour être honnête. J'ai utilisé de ne pas utiliser l'énumération de la classe parce que je pensais que c'était lourd pour juste un tableau de constantes. Je l'aime mieux que le peu de moyen que vous pouvez les utiliser en C#.
http://members.fortunecity.com/neshkov/dj.html -- Java decompiler
nous avons juste fait un enum extension pour c#
https://github.com/simonmau/enum_ext
C'est juste une mise en œuvre pour la typesafeenum, mais il fonctionne très bien donc nous avons fait un paquet de partager - avoir du plaisir avec elle
Enum dans Java est beaucoup plus complexe que le C# enum et donc plus puissant.
Puisque c'est juste un autre moment de la compilation syntaxique de sucre, je me demandais si c'était vraiment la peine d'avoir inclus la langue compte tenu de sa faible utilisation dans la vraie vie des applications.
Parfois, il est plus difficile de garder des choses de la langue que de céder à la pression d'inclure une fonctionnalité mineure.
Vous pouvez également utiliser une classe utilitaire pour chaque type enum qui détient un exemple avec l'avancée des données pour chaque valeur d'enum.