Beralih dari C # ke Jawa, "gotchas" mana yang harus saya pedulikan?

9

Saya mungkin harus beralih ke Jawa untuk proyek baru. Saya memiliki sedikit pengetahuan tentang Java, karena saya terutama belajar dan menggunakan C #, dan saya takut perbedaan antara dua bahasa / platform ini cenderung menyebabkan saya banyak masalah.

Apa perangkap / gotcha yang harus saya pedulikan?

Vimvq1987
sumber
Saya pikir blog ini mencakup banyak hal yang Anda cari .. ericsink.com/entries/java_eclipse_2.html
Hari Menon
3
Ada banyak perbedaan antara C # dan Java dan setiap satu adalah "jawaban" potensial untuk pertanyaan ini. Namun, saya ragu itu akan sangat berguna bagi Anda atau orang lain. Mengajukan pertanyaan yang lebih spesifik dan nyata akan menghasilkan jawaban yang lebih bermanfaat. Atau, coba minta referensi atau panduan untuk beralih dari C # ke Java daripada perbedaan (tanpa akhir) yang efektif.
Dengan kata lain, coba ajukan pertanyaan "mengapa" atau "bagaimana" tentang masalah tertentu. Misalnya, meminta referensi, panduan, atau buku seperti bertanya "bagaimana saya bisa beralih dari C # ke Jawa", atau bertanya tentang kode spesifik yang tidak Anda pahami adalah pertanyaan "mengapa ini dilakukan X alih-alih Y".
Pertimbangkan untuk membuat komunitas-wiki ini
finnw

Jawaban:

36

Berikut adalah beberapa gotcha Java penting ketika berasal dari C #:

  • Di Jawa, switchcase dapat secara diam-diam masuk ke yang berikutnya, jadi pastikan Anda selalu meletakkannya breakkapan saja sesuai. Anda juga tidak bisa switchdi Stringdi Jawa.
  • Generik tidak dapat diverifikasi dan dapat diukur dengan hanya tipe referensi. Tidak ada List<int>, hanya a List<Integer>. Autoboxing menyembunyikan verbosity, tetapi Anda bisa dapatkan NullPointerExceptionketika unboxing a null. Juga, ==dan !=pada dua tipe primitif kotak melakukan perbandingan referensi.
    • ... karena ==dan !=pada dua jenis referensi (mis. String) selalu perbandingan referensi
    • Sebuah intdapat diautobox ke Integer; tidak ada autoboxing dari int[]ke Integer[].
  • Jawa byte, short, int, longditandatangani saja. Perhatikan ekstensi tanda yang tidak diinginkan.
  • Tidak ada array multidimensi, hanya array array di Jawa.
  • Sebagian besar sub*metode kueri rentang menggunakan batas bawah inklusif dan batas atas eksklusif

Lihat juga

Pertanyaan-pertanyaan Terkait

Pada beberapa topik yang tercantum di atas:

Pada Gotchas Jawa umum:

polygenelubricants
sumber
8
Sekarang Anda dapat mengaktifkan String di Java SE 7.
Malcolm
+1 untuk Generik tidak dapat diverifikasi dan parameternya hanya dengan tipe referensi , ini banyak membantu saya hari ini
cctan
Anda juga harus menambahkan java tidak memiliki struct.
13

Salah satu perangkap yang jelas adalah membandingkan string dengan gaya C # string1 == string2(Java membandingkan hanya referensi) daripada gaya Java string1.equals(string2).

Satu lagi adalah itu privateadalah pengubah akses default di C #, packagedi Jawa.

Juga ToString()metode tidak secara otomatis dilokalisasi oleh budaya saat ini di Jawa.

Cloudanger
sumber
Ini merupakan perpanjangan dari kenyataan bahwa tidak ada kelebihan operator.
Graphain
3
Salah. Package-private adalah pengubah akses default Java.
Oliver Weiler
Metode @Helper: Oh, maaf. Maksud saya C # memiliki pribadi sebagai default, tetapi tidak Java. Sekarang sudah diedit.
12

Salah satu yang membuat saya adalah argumen Java substring adalah beginIndex, endIndex sementara C # Subtring args adalah startIndex, panjang. Itu perbedaan yang cukup untuk membuatnya menjengkelkan dan kemungkinan bagus untuk mendapatkan indeks keluar dari batas baik cara Anda beralih.

Krock
sumber
3
+1 Yang lebih membingungkan adalah kenyataan, bahwa itu adalah beginIndex INCLUSIVE dan endIndex EXCLUSIVE ... dan ada beberapa API yang ditemukan di JDK yang menggunakan startIndex, pendekatan panjang ...
Oliver Weiler
10
  • Anda tidak mendapatkan LINQ
  • Anda tidak mendapatkan UI yang tampak bagus (tanpa WPF)
  • Tidak ada properti
  • Anda bisa menari orang Mesir
  • Anda mendapatkan API tanpa contoh dan dokumentasi yang baik

Hm


sumber
2
Tidak pernah menemukan Java API buruk (sebenarnya lebih mudah dinavigasi) tetapi jelas ada lebih sedikit contoh. Ada apa ini dengan orang Mesir?
Graphain
3
Saya memperbaiki ini ...... bahkan jika itu adalah pukulan rendah sarkastik.
buka
8
Apakah ini jebakan yang benar? Saya memahami perangkap sebagai kemungkinan penyebab bug. Ini hanya hal-hal yang harus Anda jalani karena Anda tidak dapat melakukan cara lain.
2
@cloudanger: setuju dengan Anda. Jebakan harus sesuatu yang "bekerja" salah, bukan sesuatu yang bahkan tidak bekerja.
Vimvq1987
10
  • Java enum jauh lebih kuat / rumit, mereka sebenarnya kelas nyata, bukan bilangan bulat bernama.
  • kelas batin di java lebih kuat (dan mereka berperilaku berbeda)
  • tidak ada delegasi, hanya objek fungsional
  • constructor chaining thingy memiliki sintaks yang sama sekali berbeda di kedua bahasa, saya cenderung gagal setiap kali saya harus melakukannya di c #
  • Java telah meluas untuk subclassing dan mengimplementasikan untuk antarmuka, yang cukup bagus. C # sebaliknya relay pada konvensi penamaan yang mengatakan bahwa antarmuka dimulai dengan huruf I atas nama mereka. Saya tidak suka konvensi itu, karena saya tidak pernah bisa yakin jika orang lain gagal.
  • java autoboxing dapat menggigit Anda di **
  • erasure tipe java benar-benar membuat segalanya lebih rumit
atamanroman
sumber
2
Anda bercanda, bukan? -1, namun. Anda tidak bisa serius.
3
Anda setidaknya harus menjelaskan titik mana yang tidak Anda sukai, jika tidak saya harus berasumsi bahwa Anda hanya trolling.
atamanroman
2
Sekarang Anda tidak hanya bercanda tetapi Anda hanya bodoh: linux penting di area backend, javadoc jauh lebih bersih daripada file bantuan ms bodoh ini yang tidak akan berfungsi jika Anda melihatnya dari jaringan. sandcastle hampir tidak didokumentasikan dan benar-benar tidak dapat digunakan tanpa gui yang tepat. kebanyakan ppl akan setuju bahwa ada koleksi yang sangat bagus dalam kerangka java dan joshua bloch melakukan pekerjaan yang bagus di sana. Dan buku "orang bodoh" hanyalah buku yang tidak Anda mengerti. Eclipse adalah IDE yang luar biasa yang VS tidak dapat berdiri tanpa plugin eksternal. Btw: Saya suka C # dan miss linq di java. Keluar dari dunia kantor-ms Anda.
atamanroman
1
Hanya satu dari barang-barang ini yang merupakan gotcha
finnw
1
-1 dari saya juga, Anda tidak tahu apa ide yang baik (dan dengan demikian tidak tahu banyak tentang pemrograman apa pun). Sunting: Pffft Java lebih matang, Java bahkan tidak memiliki obat generik sungguhan ..
6

Meta-pitfall terbesar adalah mengasumsikan bahwa bahasa Jawa dan perpustakaan berperilaku sama dengan hal-hal yang mirip di C #. Lakukan tutorialnya, baca javadocs, jangan anggap ...

Meta-pitfall lain adalah dengan menganggap bahwa fakta bahwa Anda dapat melakukan sesuatu di Jawa sama mudah / sebaik yang Anda bisa / bisa di C #. Itu tidak benar. Java adalah bahasa yang jauh lebih tua, dan kesalahan dibuat ...

Dan meta-pitfall terakhir adalah berpikir bahwa mengeluh tentang hal-hal yang hilang / berbeda di Jawa pada SO akan membuat Anda mendapatkan respons yang simpatik / mendukung secara universal!

Stephen C
sumber
3

Waspadai perbedaan pengubah akses default. Perhatikan juga bahwa semua metode non-statis di Java adalah virtual (kecuali jika Anda menandainya sebagai final).

Meskipun agak ketinggalan zaman, saya menemukan ini sebagai referensi yang bagus.

Perbandingan C # dan Java, oleh Dare Obasanjo

pengguna5631
sumber
3
Also note that all non-static methods in Java are virtual.Betapa aku berharap C # juga seperti ini
Graphain
3
Saya senang tidak, karena itu menghancurkan alasan OOP. Dengan setiap metode yang virtual secara default, Anda pada dasarnya memungkinkan seluruh kelas Anda untuk diganti, yang biasanya tidak Anda inginkan. Juga, mengubah metode dari non-final ke final dapat memecah kode turunan, sedangkan sebaliknya tidak.
Femaref
0

Saya pikir pertanyaan Anda subjektif. Semua tidak bisa dijelaskan di sini. Saya sarankan Anda untuk membaca Java Puzzlers , By Joshua Bloch and Neal Gafter. Anda dapat belajar lebih banyak dan aman dari perangkap.


sumber
tidak semua jebakan, tetapi jebakan yang merupakan programmer C # cenderung membuat, di Jawa :)
Vimvq1987
1
@ Vimvq1987 - tidak ada alasan untuk menganggap bahwa Anda tidak akan mengalami perangkap "Java Puzzlers" setelah beralih ke Java.
Stephen C
-1

Dalam bahasa Jawa, ekuivalen objektif dari tipe primitif seperti int, char, bukan "tipe nilai" (misalnya Integer adalah tipe referensi). Dalam C # System.Int32 adalah struktur.


sumber