C # 'dan Java' ya geçiş yapmalıyım.


9

Yeni proje için Java'ya geçmem gerekebilir. Java hakkında çok az bilgim var, çünkü esas olarak C # çalıştım ve kullandım ve bu iki dil / platform arasındaki farkların bana birçok soruna neden olması gerektiğinden korkuyorum.

İlgilenmem gereken tuzaklar / gotchalar nelerdir?


Bence bu blog aradığınız birçok şeyi kapsıyor .. ericsink.com/entries/java_eclipse_2.html
Hari Menon

3
C # ve Java arasında birçok fark vardır ve her biri bu sorunun potansiyel bir "cevabıdır". Ancak, bunun sizin veya başkaları için çok yararlı olacağından şüpheliyim. Daha spesifik, gerçek bir soru sormak daha faydalı cevaplar verecektir. Alternatif olarak, (etkili bir şekilde sonsuz) farklılıklar yerine C # 'dan Java'ya geçiş için referanslar veya kılavuzlar istemeyi deneyin .

Başka bir deyişle, bunun yerine belirli bir sorun hakkında "neden" veya "nasıl" sorusu sormayı deneyin . Örneğin, referanslar, kılavuzlar veya kitaplar istemek, "C # 'dan Java'ya nasıl geçebilirim" sorusunu sormak veya anlamadığınız belirli bir kodu sormak "bu neden Y yerine X yapıyor" sorusudur.

Bu topluluğu-wiki yapmayı düşünün
finnw

Yanıtlar:


36

İşte C # dan bazı önemli Java gotchas:

  • Java'da, switchvakalar sessizce bir sonrakine geçebilir, bu nedenle uygun olduğunda her zaman koyduğunuzdan emin olun break. Ayrıca olamaz switchüzerine StringJava.
  • Jenerikler yalnızca referans türleriyle ilişkilendirilmez ve parametrelendirilebilir. Hayır List<int>, sadece a List<Integer>. Otomatik kutulama ayrıntı düzeyini gizler, ancak kutudan NullPointerExceptionçıkarken a alabilirsiniz null. Ayrıca ==ve !=iki kutulu ilkel tipte referans karşılaştırması yapın.
    • ... çünkü ==ve !=iki referans türünde (örneğin String) her zaman referans karşılaştırması vardır
    • An intotomatik kutuya bir Integer; hiçbir Autoboxing yoktur int[]için Integer[].
  • Java'nın byte, short, int, longsadece imzalanır. İstenmeyen işaret uzantısına dikkat edin.
  • Çok boyutlu diziler yok, yalnızca Java'daki diziler dizisi.
  • Çoğu sub*aralıklı sorgu yöntemleri kapsayıcı alt sınır ve özel üst sınır kullanır

Ayrıca bakınız

İlgili sorular

Yukarıda listelenen bazı konularda:

Genel olarak Java gotchas:


8
Şimdi String'i Java SE 7'de açabilirsiniz.
Malcolm

Generics için +1, yalnızca referans türleriyle ilişkilendirilmemiştir ve parametrelendirilebilir , bu bugün bana çok yardımcı oldu
cctan

Ayrıca java hiçbir yapıları eklemeniz gerekir.

13

Belirgin bir tuzak, dizeleri string1 == string2Java stili yerine C # stili ile karşılaştırmaktır (Java sadece referansları karşılaştırır) string1.equals(string2).

Bir diğeri, Java'daki privateC #'daki varsayılan erişim değiştiricisidir package.

Ayrıca ToString()yöntemler Java'daki mevcut kültür tarafından otomatik olarak yerelleştirilmez.


Bu, aşırı operatör yükü olmaması gerçeğinin bir uzantısıdır.
Graphain

3
Yanlış. Package-private, Java'nın varsayılan erişim değiştiricisidir.
Oliver Weiler

@Helper Method: Ah, üzgünüm. C # varsayılan olarak özel vardı, ama Java değil demek istedim. Şimdi düzenlendi.

12

Beni alan Java alt dize bağımsız değişkenleri beginIndex, endIndex iken C # Alttrtr argümanları startIndex, length. Bu sinir bozucu yapmak için yeterli bir fark ve geçiş her iki yönde endeksi sınırların dışına almak için iyi bir olasılık.


3
+1 Daha kafa karıştırıcı olan şey, beginIndex INCLUSIVE ve endIndex EXCLUSIVE'ın olması ve JDK'da startIndex, uzunluk yaklaşımını kullanan bazı API'lerin bulunması ...
Oliver Weiler

10
  • LINQ almıyorsunuz
  • İyi görünmüyorsunuz - UI (WPF yok)
  • Özellik yok
  • Mısırlılar dans ediyorsun
  • Örnekler ve iyi belgeler olmadan API'ler alırsınız

Hm.


2
Java API'sini hiç kötü bulmadım (aslında gezinmesi daha kolay), ancak kesinlikle daha az örnek var. Mısırlılar hakkında ne var?
Graphain

3
Bunu dile getiriyorum ...... alaycı bir düşük darbe olsa bile.
mpen


8
Bunlar gerçek tuzaklar mı? Tuzakları hataların olası nedenleri olarak anlıyorum. Bunlar sadece başka bir şekilde yapamayacağınız için yaşamak zorunda olduğunuz şeyler.

2
@cloudanger: sana katılıyorum. Tuzaklar, işe yaramayan bir şey değil, yanlış çalışan bir şey olmalı.
Vimvq1987

10
  • Java sıralamaları çok daha güçlü / karmaşıktır, aslında adlandırılmış tamsayılar yerine gerçek sınıflardır.
  • Java'daki iç sınıflar daha güçlüdür (ve farklı davranırlar)
  • delege yok, sadece işlevsel nesneler
  • thingy zincirleme kurucu her iki dilde tamamen farklı bir sözdizimi vardır, ben c # yapmak zorunda her zaman başarısız eğilimindedir
  • Java, alt sınıflama için uzanır ve arayüzler için uygular, ki bu oldukça güzel. Bunun yerine C #, arabirimlerin adlarında büyük harf I ile başladığını söyleyen bir adlandırma kuralında geçiş yapar. Bu konvansiyonu sevmiyorum, çünkü başkasının başarısız olup olmadığından asla emin olamıyorum.
  • java otomatik boks sizi bir ısırır
  • Java tipi silme işleri gerçekten daha karmaşık hale getirir

2
Şaka yapıyorsun, değil mi? Ancak -1. Ciddi olamazsın.

3
en azından hangi noktayı sevmediğinizi netleştirmelisiniz, aksi takdirde sadece trolling yaptığınızı varsaymak zorundayım.
atamanroman

2
şimdi sadece şaka değil, sadece cahil: linux arka uç alanında önemlidir, javadoc ağ paylaşımlarından görüntülediğinizde çalışmayacak bu aptal ms yardım dosyalarından çok daha temiz. sandcastle neredeyse uygun bir gui olmadan belgelenmemiş ve tamamen kullanılamaz. en ppl orada java çerçevesinde gerçekten güzel bir koleksiyon olduğunu kabul edecek ve joshua bloch orada güzel bir iş yaptı. Ve "egghead" kitapları sadece anlamadığınız kitaplardır. Eclipse, VS'nin harici eklentiler olmadan duramayacağı harika bir IDE'dir. Btw: C # seviyorum ve Java linq özledim. MS-ofis-dünyanızdan çıkın.
atamanroman

1
Bu eşyalardan sadece biri gotcha
finnw

1
-1 benden de, iyi bir ide ne olduğunu bilmiyorsunuz (ve böylece programlama ile ilgili hiçbir şey bilmiyorsunuz). Edit: Pffft Java daha olgun, Java bile gerçek jenerikleri yok ..

6

En büyük meta tuzak, Java dili ve kütüphanelerinin C #'daki benzer görünümlü şeylerle aynı şekilde davrandığını varsaymaktır . Öğreticileri yapın, javadocları okuyun, varsaymayın ...

Başka bir meta tuzak, Java'da bir şeyi C # ' da olabildiğince kolay / güzel yapabileceğinizi varsaymaktır . Bu doğru değil. Java çok daha eski bir dildir ve hatalar yapılmıştır ...

Ve son meta tuzak, SO'da Java'da eksik / farklı olan şeylerden şikayet etmenin sizi evrensel olarak sempatik / destekleyici yanıtlar alacağını düşünmektir !


3

Varsayılan erişim değiştiricilerindeki farklılıklara dikkat edin. Ayrıca, Java'daki statik olmayan tüm yöntemlerin sanal olduğunu unutmayın (bunları son olarak işaretlemezseniz).

Her ne kadar biraz güncel olmasa da, bunun harika bir referans olduğunu gördüm.

C # ve Java'nın Dare Obasanjo ile karşılaştırılması


3
Also note that all non-static methods in Java are virtual.Keşke C # da
böyleydi

3
OOP nedenini yok ettiği için olmamasına sevindim. Her yöntemin varsayılan olarak sanal olmasıyla, temelde tüm sınıfınızın değiştirilmesini sağlarsınız. Ayrıca, bir yöntemin son olmayandan sonuncuya değiştirilmesi, türetme kodunu bozabilir, diğer yol ise değiştirmez.
Femaref


0

Bence sorunuz öznel. Hepsi burada açıklanamaz. Ben okumanızı öneririm Java puzzlers ederek, Joshua Bloch and Neal Gafter. Daha fazla bilgi edinebilir ve tuzaklardan korunabilirsiniz.


tüm tuzaklar değil, ama C # programcısı olan tuzaklar Java ile yapacak gibi görünüyor :)
Vimvq1987

1
@ Vimvq1987 - Java'ya geçtikten sonra "Java Puzzlers" tuzaklarına girmeyeceğinizi varsayalım.
Stephen C

-1

Java dilinde int, char gibi ilkel türlerin objektif eşdeğerleri "değer türleri" değildir (örn. Tamsayı bir referans türüdür). C # 'da System.Int32 bir yapıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.