Saya sudah pemrograman di Jawa untuk sementara waktu dan baru saja dilempar ke proyek yang sepenuhnya ditulis dalam C #. Saya mencoba untuk mempercepat di C #, dan memperhatikan enum yang digunakan di beberapa tempat di proyek baru saya, tetapi pada pandangan pertama, enum C # tampaknya lebih sederhana daripada implementasi Java 1.5+. Adakah yang bisa menyebutkan perbedaan antara C # dan Java enum, dan bagaimana cara mengatasi perbedaan? (Saya tidak ingin memulai perang api bahasa, saya hanya ingin tahu bagaimana melakukan beberapa hal dalam C # yang biasa saya lakukan di Jawa). Sebagai contoh, dapatkah seseorang memposting rekan C # ke Planet Sun yang terkenal sebagai contoh?
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
Ogre Psalm33
sumber
sumber
Jawaban:
Penghitungan dalam CLR hanya disebut konstanta. Jenis yang mendasarinya harus integral. Di Jawa enumerasi lebih seperti turunan dari tipe. Jenis itu bisa sangat kompleks dan - seperti contoh Anda tunjukkan - mengandung banyak bidang dari berbagai jenis.
Untuk mem-port contoh ke C # saya hanya akan mengubah enum ke kelas yang tidak dapat diubah dan mengekspos instance readonly statis dari kelas itu:
sumber
Di C # Anda dapat menentukan metode ekstensi pada enum, dan ini membuat beberapa fungsi yang hilang.
Anda dapat mendefinisikan
Planet
sebagai enum dan juga memiliki metode ekstensi yang setara dengansurfaceGravity()
dansurfaceWeight()
.Saya telah menggunakan atribut khusus seperti yang disarankan oleh Mikhail , tetapi hal yang sama dapat dicapai menggunakan Kamus.
sumber
Dalam C # atribut dapat digunakan dengan enum. Contoh yang bagus dari pola pemrograman ini dengan deskripsi terperinci ada di sini (Codeproject)
Sunting: pertanyaan ini baru-baru ini ditanyakan lagi dan dijawab oleh Jon Skeet: Apa yang setara dengan enum Java di C #? Kelas dalam pribadi di C # - mengapa mereka tidak digunakan lebih sering?
Sunting 2: lihat jawaban yang diterima yang memperluas pendekatan ini dengan cara yang sangat brilian!
sumber
Java enum sebenarnya adalah kelas penuh yang dapat memiliki konstruktor dan metode pribadi dll, sedangkan C # enums hanya bernama integer. Implementasi IMO Java jauh lebih unggul.
Halaman ini akan banyak membantu Anda saat belajar c # berasal dari sebuah java camp. (Tautan menunjuk ke perbedaan tentang enum (gulir ke atas / bawah untuk hal-hal lain)
sumber
FOO = 0
yang lebih mudah digunakan dalam alat ORM (tidakordinal()
perlu penggunaan rawan kesalahan ). Selanjutnya C # mendukung enumerasi bitwise yang seringkali sangat berguna, terutama dalam kombinasi denganEntityFramework
. Java harus memperluas enum mereka untuk memungkinkan mereka diikat ke bilangan bulat juga. Maka mereka akan lebih unggul :)Sesuatu seperti ini saya pikir:
Atau gabungkan konstanta ke dalam
Planet
kelas seperti di atassumber
Berikut ini ide menarik lainnya yang melayani perilaku khusus yang tersedia di Jawa. Saya datang dengan
Enumeration
kelas dasar berikut :Itu punya tipe parameter pada dasarnya hanya sehingga jumlah ordinal akan bekerja dengan baik di berbagai penghitungan turunan.
Operator
Contoh Jon Skeet dari jawaban atas pertanyaan lain (http://stackoverflow.com/questions/1376312/whats-the-equivalent-of-javas-enum-in-c) di atas kemudian menjadi:Ini memberi beberapa keuntungan.
string
danint
yang membuat pernyataan peralihan layakSystem.Enum
dapat ditambahkan ke kelas Pencacahan dasar untuk memungkinkan fungsi yang sama.sumber
kami baru saja membuat ekstensi enum untuk c # https://github.com/simonmau/enum_ext
Ini hanya implementasi untuk typesafeenum, tetapi berfungsi dengan baik sehingga kami membuat paket untuk dibagikan - bersenang-senanglah dengannya
sumber
Java enum adalah gula sintaksis untuk menyajikan enumerasi dengan cara OO. Mereka adalah kelas abstrak yang memperluas kelas Enum di Jawa, dan setiap nilai enum seperti implementasi instance publik akhir statis dari kelas enum. Lihatlah kelas yang dihasilkan, dan untuk enum "Foo" dengan 10 nilai, Anda akan melihat "Foo $ 1" hingga "Foo $ 10" dihasilkan.
Saya tidak tahu C #, saya hanya bisa berspekulasi bahwa enum dalam bahasa itu lebih seperti enum tradisional dalam bahasa gaya C. Saya melihat dari pencarian Google cepat bahwa mereka dapat menyimpan beberapa nilai, jadi mereka mungkin diimplementasikan dengan cara yang sama, tetapi dengan batasan yang jauh lebih banyak daripada yang diizinkan oleh kompiler Java.
sumber
Java enum memungkinkan konversi typesafe mudah dari nama menggunakan metode valueOf yang dihasilkan kompiler, yaitu
Persamaan untuk enum mentah dalam C # lebih verbose:
Namun, jika Anda turun rute sugegsted oleh Kent, Anda dapat dengan mudah menerapkan
ValueOf
metode di kelas enum Anda.sumber
Saya curiga enum dalam C # hanyalah konstanta internal CLR, tetapi tidak terlalu familiar dengan mereka. Saya telah mendekompilasi beberapa kelas di Java dan saya dapat memberi tahu Anda bahwa Enums adalah saat Anda mengonversi.
Java melakukan sesuatu yang licik. Ini memperlakukan kelas enum sebagai kelas normal dengan, sedekat yang saya bisa bayangkan, menggunakan banyak makro ketika merujuk nilai enum. Jika Anda memiliki pernyataan kasus di kelas Java yang menggunakan enum, itu menggantikan referensi enum ke integer. Jika Anda perlu pergi ke string, itu menciptakan array string yang diindeks oleh ordinal yang digunakan di setiap kelas. Saya menduga untuk menghemat tinju.
Jika Anda mengunduh dekompiler ini, Anda akan dapat melihat bagaimana ia membuat kelasnya dan mengintegrasikannya. Agak menarik untuk jujur. Dulu saya tidak menggunakan kelas enum karena saya pikir itu membengkak hanya untuk array konstanta. Saya menyukainya lebih baik daripada cara terbatas Anda dapat menggunakannya dalam C #.
http://members.fortunecity.com/neshkov/dj.html - dekompiler Java
sumber
Enum di Jawa jauh lebih kompleks daripada C # enum dan karenanya lebih kuat. Karena ini hanyalah gula waktu kompilasi sintaksis lainnya, saya bertanya-tanya apakah benar-benar layak untuk memasukkan bahasa yang diberikan penggunaannya yang terbatas dalam aplikasi kehidupan nyata. Terkadang lebih sulit menjauhkan hal-hal dari bahasa daripada menyerah pada tekanan untuk memasukkan fitur minor.
sumber
sumber
Anda juga bisa menggunakan kelas utilitas untuk setiap jenis enum yang menyimpan instance dengan data lanjutan untuk setiap nilai enum.
sumber