He estado programando en Java por un tiempo y acabo de lanzarme a un proyecto que está escrito completamente en C #. Estoy tratando de acelerar en C #, y noté que las enumeraciones se utilizan en varios lugares en mi nuevo proyecto, pero a primera vista, las enumeraciones de C # parecen ser más simplistas que la implementación de Java 1.5+. ¿Alguien puede enumerar las diferencias entre C # y las enumeraciones de Java, y cómo superar las diferencias? (No quiero comenzar una guerra de llamas de lenguaje, solo quiero saber cómo hacer algunas cosas en C # que solía hacer en Java). Por ejemplo, ¿alguien podría publicar una contraparte de C # en el famoso ejemplo de enum Planet de Sun?
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 ...]
c#
java
enums
language-comparisons
Salmo de ogro33
fuente
fuente
Respuestas:
Las enumeraciones en el CLR se denominan simplemente constantes. El tipo subyacente debe ser integral. En Java, una enumeración es más como una instancia con nombre de un tipo. Ese tipo puede ser bastante complejo y, como muestra su ejemplo, contener múltiples campos de varios tipos.
Para transferir el ejemplo a C #, simplemente cambiaría la enumeración a una clase inmutable y expondría instancias de solo lectura estática de esa clase:
fuente
En C # puede definir métodos de extensión en enumeraciones, y esto compensa algunas de las funciones faltantes.
Puede definir
Planet
como una enumeración y también tener métodos de extensión equivalentes asurfaceGravity()
ysurfaceWeight()
.He usado atributos personalizados como sugiere Mikhail , pero lo mismo podría lograrse usando un Diccionario.
fuente
En C # los atributos se pueden usar con enumeraciones. Un buen ejemplo de este patrón de programación con una descripción detallada está aquí (Codeproject)
Editar: esta pregunta se volvió a hacer recientemente y Jon Skeet respondió: ¿Cuál es el equivalente de la enumeración de Java en C #? Clases internas privadas en C #: ¿por qué no se usan con más frecuencia?
Edición 2: ¡ vea la respuesta aceptada que extiende este enfoque de una manera muy brillante!
fuente
Las enumeraciones de Java son en realidad clases completas que pueden tener un constructor privado y métodos, etc., mientras que las enumeraciones de C # son simplemente enteros. La implementación de IMO Java es muy superior.
Esta página debería ayudarte mucho mientras aprendes c # proveniente de un campamento de Java. (El enlace apunta a las diferencias sobre las enumeraciones (desplácese hacia arriba / abajo para otras cosas)
fuente
FOO = 0
que es más fácil de usar en las herramientas ORM (no esordinal()
necesario el uso propenso a errores ). Además, C # admite enumeraciones bit a bit que a menudo son muy útiles, especialmente en combinación conEntityFramework
. Java debería extender sus enumeraciones para permitir que también se unan a enteros. Entonces serían superiores :)Algo como esto, creo:
O combine las constantes en la
Planet
clase como arribafuente
Aquí hay otra idea interesante que satisface el comportamiento personalizado disponible en Java. Se me ocurrió la siguiente
Enumeration
clase base:Tiene un parámetro de tipo básicamente solo para que el recuento ordinal funcione correctamente en diferentes enumeraciones derivadas. El
Operator
ejemplo de Jon Skeet de su respuesta a otra pregunta (http://stackoverflow.com/questions/1376312/whats-the-equivalent-of-javas-enum-in-c) se convierte en:Esto le da algunas ventajas.
string
yint
que hace factibles las declaraciones de cambioSystem.Enum
se pueden agregar a la clase de enumeración base para permitir la misma funcionalidad.fuente
acabamos de hacer una extensión enum para c # https://github.com/simonmau/enum_ext
Es solo una implementación para el typesafeenum, pero funciona muy bien, así que creamos un paquete para compartir, diviértete con él
fuente
Una enumeración de Java es azúcar sintáctica para presentar enumeraciones de una manera OO. Son clases abstractas que extienden la clase Enum en Java, y cada valor enum es como una implementación estática de instancia pública final de la clase enum. Mire las clases generadas, y para una enumeración "Foo" con 10 valores, verá las clases "Foo $ 1" a "Foo $ 10" generadas.
Sin embargo, no sé C #, solo puedo especular que una enumeración en ese lenguaje es más como una enumeración tradicional en lenguajes de estilo C. Sin embargo, veo en una búsqueda rápida en Google que pueden contener múltiples valores, por lo que probablemente se implementen de manera similar, pero con muchas más restricciones de las que permite el compilador de Java.
fuente
Las enumeraciones de Java permiten conversiones fáciles de escribir a partir del nombre utilizando el método valueOf generado por el compilador, es decir
El equivalente para una enumeración en bruto en C # es más detallado:
Sin embargo, si sigue la ruta sugerida por Kent, puede implementar fácilmente un
ValueOf
método en su clase de enumeración.fuente
Sospecho que las enumeraciones en C # son solo constantes internas del CLR, pero no están tan familiarizadas con ellas. He descompilado algunas clases en Java y puedo decirte que quieres Enums una vez que te conviertes.
Java hace algo astuto. Trata la clase enum como una clase normal con, por lo que puedo imaginar, usando muchas macros al hacer referencia a los valores enum. Si tiene una declaración de caso en una clase Java que usa enumeraciones, reemplaza las referencias de enumeración a enteros. Si necesita ir a una cadena, crea una matriz de cadenas indexadas por un ordinal que usa en cada clase. Sospecho que ahorraré en el boxeo.
Si descarga este descompilador, verá cómo crea su clase y la integra. Más bien fascinante para ser honesto. No solía usar la clase enum porque pensaba que era hinchada solo por una serie de constantes. Me gusta más que la forma limitada en que puedes usarlos en C #.
http://members.fortunecity.com/neshkov/dj.html - Descompilador Java
fuente
La enumeración en Java es mucho más compleja que la enumeración de C # y, por lo tanto, es más potente. Dado que es solo otro azúcar sintáctico en tiempo de compilación, me pregunto si realmente valió la pena incluir el lenguaje dado su uso limitado en aplicaciones de la vida real. A veces es más difícil mantener las cosas fuera del lenguaje que renunciar a la presión de incluir una característica menor.
fuente
fuente
También podría usar una clase de utilidad para cada tipo de enumeración que contiene una instancia con datos avanzados para cada valor de enumeración.
fuente