Eu tenho programado em Java por um tempo e acabei de ser lançado em um projeto que é inteiramente escrito em C #. Estou tentando acelerar o processo em C # e notei enumerações usadas em vários lugares no meu novo projeto, mas, à primeira vista, as enumerações em C # parecem ser mais simplistas que a implementação do Java 1.5+. Alguém pode enumerar as diferenças entre enumerações C # e Java e como superar as diferenças? (Não quero iniciar uma guerra de chamas na linguagem, só quero saber como fazer algumas coisas em C # que costumava fazer em Java). Por exemplo, alguém poderia postar uma contrapartida em C # no famoso exemplo enum Planet da 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 Ogro33
fonte
fonte
Respostas:
Enumerações no CLR são simplesmente denominadas constantes. O tipo subjacente deve ser integral. Em Java, uma enumeração é mais como uma instância nomeada de um tipo. Esse tipo pode ser bastante complexo e - como mostra o exemplo - conter vários campos de vários tipos.
Para portar o exemplo para C #, eu mudaria o enum para uma classe imutável e exporia instâncias estáticas somente leitura dessa classe:
fonte
No C #, você pode definir métodos de extensão nas enumerações, e isso compensa algumas das funcionalidades ausentes.
Você pode definir
Planet
como uma enumeração e também ter métodos de extensão equivalentes asurfaceGravity()
esurfaceWeight()
.Eu usei atributos personalizados, conforme sugerido por Mikhail , mas o mesmo pode ser alcançado usando um Dicionário.
fonte
Em C #, os atributos podem ser usados com enumerações. Um bom exemplo desse padrão de programação com descrição detalhada está aqui (Codeproject)
Edit: esta questão foi recentemente perguntada novamente e respondida por Jon Skeet: Qual é o equivalente da enumeração de Java em C #? Classes internas privadas em C # - por que não são usadas com mais frequência?
Edit 2: veja a resposta aceita que amplia essa abordagem de uma maneira muito brilhante!
fonte
As enumerações Java são na verdade classes completas que podem ter um construtor e métodos particulares, etc. A implementação da IMO Java é muito superior.
Esta página deve ajudá-lo bastante ao aprender c # vindo de um acampamento em java. (O link aponta para as diferenças de enumerações (role para cima / para baixo para outras coisas)
fonte
FOO = 0
que é mais fácil de usar nas ferramentas ORM (nenhumordinal()
uso propenso a erros é necessário). C # adicional suporta enumerações bit a bit que geralmente são muito úteis, especialmente em combinação comEntityFramework
. Java deve estender suas enumerações para permitir que elas também sejam ligadas a números inteiros. Em seguida, eles seriam :) superioresAlgo assim, eu acho:
Ou combine as constantes na
Planet
classe como acimafonte
Aqui está outra idéia interessante que atende ao comportamento personalizado disponível em Java. Eu vim com a seguinte
Enumeration
classe base:Ele possui um parâmetro de tipo basicamente apenas para que a contagem ordinal funcione corretamente em diferentes enumerações derivadas. O
Operator
exemplo de Jon Skeet de sua resposta a outra pergunta (http://stackoverflow.com/questions/1376312/whats-the-equivalent-of-javas-enum-in-c) acima se torna:Isso dá algumas vantagens.
string
eint
que viabiliza declarações de trocaSystem.Enum
podem ser adicionados à classe de enumeração base para permitir a mesma funcionalidade.fonte
acabamos de fazer uma extensão de enum para c # https://github.com/simonmau/enum_ext
É apenas uma implementação para o typesafeenum, mas funciona muito bem, então criamos um pacote para compartilhar - divirta-se com ele
fonte
Uma enumeração Java é um açúcar sintático para apresentar enumerações de maneira OO. São classes abstratas estendendo a classe Enum em Java, e cada valor de enum é como uma implementação estática de instância pública final da classe enum. Observe as classes geradas e, para um enum "Foo" com 10 valores, você verá as classes "Foo $ 1" a "Foo $ 10" geradas.
Porém, eu não sei C #, só posso especular que um enum nesse idioma é mais como um enum tradicional em idiomas no estilo C. Vejo em uma rápida pesquisa no Google que eles podem conter vários valores, portanto, provavelmente são implementados de maneira semelhante, mas com muito mais restrições do que o compilador Java permite.
fonte
As enumerações Java permitem conversões fáceis de digitar com segurança do nome usando o método valueOf gerado pelo compilador, ou seja,
O equivalente a um enum bruto em C # é mais detalhado:
No entanto, se você seguir a rota sugerida por Kent, poderá implementar facilmente um
ValueOf
método na sua classe enum.fonte
Eu suspeito que enums em C # são apenas constantes internas ao CLR, mas não tão familiarizadas com eles. Decompilei algumas classes em Java e posso dizer que você deseja que as Enums sejam convertidas.
Java faz algo sorrateiro. Ele trata a classe enum como uma classe normal, usando, o mais próximo possível, o uso de muitas macros ao referenciar os valores de enum. Se você tiver uma instrução de caso em uma classe Java que usa enumerações, ela substitui as referências de enumeração por números inteiros. Se você precisar ir para a string, ela cria uma matriz de strings indexadas por um ordinal usado em cada classe. Eu suspeito de economizar no boxe.
Se você baixar esse descompilador, verá como ele cria sua classe e o integra. É fascinante ser honesto. Eu não costumava usar a classe enum porque achava que estava inchada por apenas uma matriz de constantes. Eu gosto mais do que a maneira limitada de usá-los em c #.
http://members.fortunecity.com/neshkov/dj.html - Descompilador Java
fonte
O enum em Java é muito mais complexo que o c # enum e, portanto, mais poderoso. Como é apenas mais um açúcar sintático em tempo de compilação, estou pensando se realmente vale a pena incluir o idioma, dado seu uso limitado em aplicativos da vida real. Às vezes, é mais difícil manter as coisas fora do idioma do que desistir da pressão para incluir um recurso menor.
fonte
fonte
Você também pode usar uma classe de utilitário para cada tipo de enumeração que contém uma instância com dados avançados para cada valor de enumeração.
fonte