Untuk c # developer yang ingin mempelajari Java, apakah ada perbedaan mendasar yang besar antara kedua bahasa yang harus ditunjukkan?
Mungkin sebagian orang mungkin menganggap hal-hal sama, tetapi ada beberapa aspek impor yang tidak boleh terlewatkan? (atau Anda benar-benar bisa mengacau!)
Mungkin dalam hal konstruksi OOP, cara kerja GC, referensi, terkait penerapan, dll.
Jawaban:
Beberapa gotcha di luar kepala saya:
byte
masuk di Java (sayangnya)static
itu akan memiliki referensi implisit ke sebuah instance dari kelas yang memuatnya.sumber
berikut adalah perbandingan yang sangat komprehensif dari 2 bahasa tersebut:
http://www.25hoursaday.com/CsharpVsJava.html
Ditambahkan: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp
sumber
Saya terkejut bahwa tidak ada yang menyebutkan properti, sesuatu yang cukup mendasar di C # tetapi tidak ada di Java. C # 3 dan di atasnya juga telah menerapkan properti secara otomatis. Di Java Anda harus menggunakan metode tipe GetX / SetX.
Perbedaan nyata lainnya adalah ekspresi LINQ dan lambda di C # 3 yang tidak ada di Java.
Ada beberapa hal sederhana namun berguna lainnya yang hilang dari Java seperti string verbatim (@ ""), operator overloading, iterator yang menggunakan hasil dan pra prosesor juga hilang di Java.
Salah satu favorit pribadi saya di C # adalah nama namespace tidak harus mengikuti struktur direktori fisik. Saya sangat menyukai fleksibilitas ini.
sumber
Ada banyak perbedaan, tetapi ini yang terpikir oleh saya:
sumber
.equals
adalah apa yang harus Anda gunakan..NET telah membuktikan obat generik; Java telah menghapus obat generik.
Perbedaannya adalah: jika Anda memiliki sebuah
ArrayList<String>
objek, dalam .NET, Anda dapat mengetahui (pada waktu proses) bahwa objek tersebut memiliki tipeArrayList<String>
, sedangkan di Java, pada waktu proses, objek tersebut bertipeArrayList
; yangString
bagian yang hilang. Jika Anda memasukkan non-String
objek ke dalamArrayList
, sistem tidak dapat memaksakannya, dan Anda hanya akan mengetahuinya setelah Anda mencoba mengekstrak item keluar, dan cast gagal.sumber
String
objek dalam daftar itu tanpa membuat cast yang tidak dicentang, di suatu tempat , dan kompilator akan memperingatkan Anda dengan benar pada saat itu bahwa kompilator tidak dapat lagi memeriksa batas-batas generik. Selama daftar Anda selalu disimpan dalam variabelList<String>
, upaya untuk memasukkan objek non-String ke dalamnya tidak akan dapat dikompilasi.add
metodenya (sekali lagi, melalui refleksi). Akankah sistem langsung menolak non-String
objek, atau hanya saat mentransmisikan hasilget
?List
. Anda dapat memiliki objek berjenis turun dariList
, sepertiArrayList
danLinkedList
. (Ini penting untuk digunakanList
alih-alihArrayList
saat membagikannya, tetapi itu tidak mengubah fakta bahwa Anda tidak dapat mengatakannyanew List()
.)Satu hal yang saya lewatkan di C # dari Java adalah penanganan paksa dari pengecualian yang dicentang. Dalam C #, sangat umum bahwa seseorang tidak menyadari pengecualian yang mungkin dilemparkan metode dan Anda bergantung pada dokumentasi atau pengujian untuk menemukannya. Tidak demikian halnya di Jawa dengan pengecualian yang dicentang.
sumber
Java memiliki autoboxing untuk primitif daripada tipe nilai, jadi meskipun
System.Int32[]
array nilai dalam C #,Integer[]
adalah array referensi keInteger
objek, dan dengan demikian tidak cocok untuk penghitungan kinerja yang lebih tinggi.sumber
Tidak ada delegasi atau acara - Anda harus menggunakan antarmuka. Untungnya, Anda dapat membuat kelas dan implementasi antarmuka secara inline, jadi ini bukan masalah besar
sumber
x => x.Foo
vs.new Bar() { public void M(SomeType x) { return x.Foo; } }
- siapa yang peduli tentang kode menjadi 10 kali lebih pendek?Fungsionalitas tanggal / kalender built-in di Java sangat buruk dibandingkan dengan System.DateTime. Ada banyak info tentang ini di sini: Apa yang salah dengan Java Date & Time API?
Beberapa di antaranya bisa didapatkan untuk pengembang C #:
Selain itu, Java tidak memiliki semua fitur yang sama dengan yang dibawa oleh GAC dan rakitan dengan nama kuat. Guci Neraka adalah istilah untuk apa yang salah saat menghubungkan / mereferensikan perpustakaan eksternal.
Sejauh menyangkut pengemasan / penerapan:
sumber
Tidak ada delegasi di Jawa. Oleh karena itu, selain dari semua manfaat yang dibawa oleh delegasi, berbagai acara juga bekerja secara berbeda. Alih-alih hanya menghubungkan metode, Anda perlu mengimplementasikan antarmuka dan melampirkannya.
sumber
Satu hal yang menonjol b / c itu ada di daftar wawancara saya adalah bahwa tidak ada analog kata kunci "baru" di Java untuk metode penyembunyian dan karenanya tidak ada peringatan compiler "Anda harus meletakkan baru di sini". Metode yang tidak disengaja bersembunyi saat Anda bermaksud mengganti prospek ke bug.
(edit misalnya) Contoh, B berasal dari A (menggunakan sintaks C #, Java berperilaku sama terakhir kali saya periksa tetapi tidak mengeluarkan peringatan kompiler). Apakah foo A dipanggil, atau foo B? (A dipanggil, mungkin mengejutkan pengembang yang mengimplementasikan B).
class A { public void foo() {code} } class B:A { public void foo() {code} } void SomeMethod() { A a = new B(); // variable's type is declared as A, but assigned to an object of B. a.foo(); }
sumber
new
metode untuk sengaja disembunyikan - atau non-final jadi diganti daripada disembunyikan.Java tidak memiliki LINQ dan dokumentasinya adalah neraka. Antarmuka pengguna di Java sulit untuk dikembangkan, Anda kehilangan semua hal baik yang diberikan Microsoft kepada kami (WPF, WCF, dll ...) tetapi mendapatkan "API" yang sulit digunakan dan hampir tidak terdokumentasi.
sumber
Satu masalah yang saya hadapi sejauh ini ketika bekerja dengan Java yang berasal dari C # adalah Pengecualian dan Kesalahan berbeda.
Misalnya Anda tidak dapat menangkap kesalahan memori menggunakan catch (Exception e).
Lihat berikut ini untuk lebih jelasnya:
why-is-java-lang-outofmemoryerror-java-heap-space-not-catch
sumber
Sudah begitu lama sejak saya berada di Java tetapi hal-hal yang saya perhatikan langsung dari kelelawar dalam pengembangan aplikasi adalah model acara C #, C # seret dan lepas vs menggunakan Manajer Tata Letak di Swing (jika Anda melakukan pengembang Aplikasi), dan penanganan pengecualian dengan Java memastikan Anda menangkap pengecualian dan C # tidak diperlukan.
sumber
Menanggapi pertanyaan Anda yang sangat langsung dalam judul Anda:
"Pengembang C # yang mempelajari Java, apa perbedaan terbesar yang mungkin diabaikan?"
J: Fakta bahwa Java jauh lebih lambat di Windows.
sumber
Perbedaan yang paling mengganggu bagi saya ketika saya beralih ke java adalah deklarasi stringnya.
di C #
string
(sebagian besar waktu) di JawaString
Ini cukup sederhana, tetapi percayalah, itu membuat Anda kehilangan begitu banyak waktu ketika Anda memiliki kebiasaan untuk
s
tidak melakukannyaS
!sumber