Wechseln Sie von C # zu Java. Welche „Fallstricke“ sollte mich interessieren?

9

Ich muss möglicherweise für ein neues Projekt zu Java wechseln. Ich habe sehr wenig Kenntnisse über Java, da ich hauptsächlich C # studiert und verwendet habe und ich befürchte, dass die Unterschiede zwischen diesen beiden Sprachen / Plattformen mir wahrscheinlich viele Probleme bereiten könnten.

Welche Fallstricke / Fallstricke sollten mich interessieren?

Vimvq1987
quelle
Ich denke, dieser Blog behandelt eine Menge Dinge, die Sie suchen .. ericsink.com/entries/java_eclipse_2.html
Hari Menon
3
Es gibt viele Unterschiede zwischen C # und Java und jeder einzelne ist eine mögliche "Antwort" auf diese Frage. Ich bezweifle jedoch, dass dies für Sie oder andere sehr nützlich wäre. Das Stellen einer spezifischeren, realen Frage würde nützlichere Antworten liefern. Alternativ können Sie nach Referenzen oder Anleitungen für den Wechsel von C # zu Java fragen , anstatt nach den (praktisch endlosen) Unterschieden.
Mit anderen Worten, stellen Sie stattdessen eine "Warum" - oder "Wie" -Frage zu einem bestimmten Problem. Wenn Sie beispielsweise nach Referenzen, Anleitungen oder Büchern fragen, fragen Sie nach der Frage, wie ich von C # zu Java wechseln kann, oder nach einem bestimmten Code, den Sie nicht verstehen, und fragen Sie, warum dies X statt Y bedeutet.
Erwägen

Antworten:

36

Hier sind einige wichtige Java-Fallstricke, wenn Sie von C # kommen:

  • In Java können switchFälle stillschweigend zum nächsten durchfallen. Stellen Sie daher sicher, dass Sie sie immer dann breakeingeben , wenn dies angebracht ist. Sie können auch nicht switchauf Stringin Java.
  • Generika sind nicht reifiziert und nur mit Referenztypen parametrierbar. Es gibt keine List<int>, nur eine List<Integer>. Autoboxing verbirgt die Ausführlichkeit, aber Sie können NullPointerExceptionbeim Auspacken eine bekommen null. Führen Sie außerdem ==und !=auf zwei primitiven Box-Typen einen Referenzvergleich durch.
    • ... weil ==und !=auf zwei Referenztypen (zB String) immer Referenzvergleiche sind
    • Ein intkann automatisch an ein Integer; Es gibt kein Autoboxing von int[]bis Integer[].
  • Java byte, short, int, longnur unterzeichnet. Achten Sie auf unbeabsichtigte Zeichenerweiterung.
  • Keine mehrdimensionalen Arrays, nur Arrays von Arrays in Java.
  • Die meisten sub*Fernabfragemethoden verwenden inklusive Untergrenze und exklusive Obergrenze

Siehe auch

Verwandte Fragen

Zu einigen der oben aufgeführten Themen:

Im Allgemeinen Java-Fallstricke:

Polygenschmierstoffe
quelle
8
Jetzt können Sie String in Java SE 7 einschalten.
Malcolm
+1 für Generika sind nicht reifiziert und nur mit Referenztypen parametrierbar. Dies hat mir heute sehr geholfen
cctan
Sie sollten auch hinzufügen, Java hat keine Strukturen.
13

Eine offensichtliche Gefahr besteht darin, Zeichenfolgen mit dem C # -Stil string1 == string2(Java vergleicht nur Referenzen) anstelle des Java-Stils zu vergleichen string1.equals(string2).

Ein weiterer privateGrund ist der Standardzugriffsmodifikator in C # packagein Java.

Auch ToString()Methoden werden von der aktuellen Kultur in Java nicht automatisch lokalisiert.

Cloudanger
quelle
Dies ist eine Erweiterung der Tatsache, dass es keine Bedienerüberlastungen gibt.
Graphain
3
Falsch. Package-Private ist Javas Standardzugriffsmodifikator.
Oliver Weiler
@Helper Methode: Oh, sorry. Ich meinte, C # hatte standardmäßig privat, aber nicht Java. Es ist jetzt bearbeitet.
12

Das, was mich dazu gebracht hat, war, dass Java- Teilzeichenfolgenargumente beginIndex und endIndex sind, während C # -Unterzeichenargumente startIndex und Länge sind. Das ist ein ausreichender Unterschied, um es ärgerlich zu machen, und eine gute Wahrscheinlichkeit, dass der Index bei jedem Wechsel aus den Grenzen gerät.

Krock
quelle
3
+1 Verwirrender ist die Tatsache, dass es sich um beginIndex INCLUSIVE und endIndex EXCLUSIVE handelt ... und dass es im JDK einige APIs gibt, die den Ansatz startIndex, length verwenden ...
Oliver Weiler
10
  • Du bekommst keinen LINQ
  • Sie erhalten keine gut aussehende Benutzeroberfläche (kein WPF)
  • Keine Eigenschaften
  • Sie bekommen tanzende Ägypter
  • Sie erhalten APIs ohne Beispiele und gute Dokumentation

Hm.


quelle
2
Ich fand die Java-API nie schlecht (tatsächlich einfacher zu navigieren), aber es gibt definitiv weniger Beispiele. Was ist das mit Ägyptern?
Graphain
3
Ich stimme dem zu ...... auch wenn es ein sarkastischer Tiefschlag ist.
Mpen
8
Sind das wahre Fallstricke? Ich verstehe Fallstricke als mögliche Ursachen für Fehler. Dies sind nur Dinge, mit denen Sie leben müssen, da Sie es auf keine andere Weise tun können.
2
@cloudanger: stimme dir zu. Fallstricke sollten Dinge sein, die falsch "funktionieren", nicht Dinge, die nicht einmal funktionieren.
Vimvq1987
10
  • Java-Enums sind viel leistungsfähiger / komplizierter, sie sind in der Tat echte Klassen anstelle von benannten ganzen Zahlen.
  • innere Klassen in Java sind mächtiger (und sie verhalten sich anders)
  • Keine Delegierten, nur Funktionsobjekte
  • Das Konstruktor-Verkettungs-Ding hat in beiden Sprachen eine völlig andere Syntax. Ich neige dazu, jedes Mal zu scheitern, wenn ich das in c # tun muss
  • Java hat Erweiterungen für Unterklassen und Implementierungen für Schnittstellen, was sehr schön ist. C # basiert stattdessen auf einer Namenskonvention, die besagt, dass Schnittstellen mit einem Großbuchstaben I in ihrem Namen beginnen. Ich mag diese Konvention nicht, da ich nie sicher sein kann, ob jemand anderes versagt.
  • Java Autoboxing kann Sie in die a ** beißen
  • Das Löschen vom Typ Java macht die Dinge wirklich komplizierter
Atamanroman
quelle
2
Du machst Witze, oder? -1 jedoch. Du kannst es nicht ernst meinen.
3
du solltest wenigstens klar machen, welchen Punkt du nicht magst, sonst muss ich davon ausgehen, dass du nur trollst.
Atamanroman
2
Jetzt machst du nicht nur Witze, sondern bist auch nur unwissend: Linux ist im Backend-Bereich wichtig. Javadoc ist viel sauberer als diese dummen MS-Hilfedateien, die nicht funktionieren, wenn du sie von Netzwerkfreigaben aus betrachtest. Sandburg ist fast nicht dokumentiert und ohne eine richtige Anleitung völlig unbrauchbar. Die meisten Leute werden zustimmen, dass es eine wirklich schöne Sammlung im Java-Framework gibt und Joshua Bloch dort einen guten Job gemacht hat. Und "Eierkopf" -Bücher sind nur Bücher, die Sie nicht verstehen. Eclipse ist eine großartige IDE, die VS ohne externe Plugins nicht aushält. Übrigens: Ich mag C # und vermisse Linq in Java. Raus aus deiner ms-office-Welt.
Atamanroman
1
Nur einer dieser Gegenstände ist ein Gotcha
Finnw
1
-1 Auch von mir wissen Sie nicht, was eine gute Idee ist (und wissen daher nicht viel über Programmierung). Edit: Pffft Java reifer, Java hat nicht einmal echte Generika ..
6

Die größte Meta-Falle besteht darin, anzunehmen, dass sich die Java-Sprache und -Bibliotheken genauso verhalten wie ähnlich aussehende Inhalte in C #. Machen Sie die Tutorials, lesen Sie die Javadocs, nehmen Sie nicht an ...

Eine weitere Meta-Falle besteht darin, anzunehmen, dass Sie etwas in Java genauso einfach / schön tun können, wie Sie es in C # können / könnten. Es ist nicht wahr. Java ist eine viel ältere Sprache und es wurden Fehler gemacht ...

Und die letzte Meta-Falle besteht darin, zu glauben, dass Sie sich allgemein über sympathische / unterstützende Antworten freuen , wenn Sie sich über fehlende / andere Dinge in Java auf SO beschweren!

Stephen C.
quelle
3

Beachten Sie die Unterschiede bei den Standardzugriffsmodifikatoren. Beachten Sie auch, dass alle nicht statischen Methoden in Java virtuell sind (es sei denn, Sie markieren sie als endgültig).

Obwohl es etwas veraltet ist, habe ich festgestellt, dass dies eine großartige Referenz ist.

Vergleich von C # und Java von Dare Obasanjo

user5631
quelle
3
Also note that all non-static methods in Java are virtual.Wie ich wünschte, C # wäre auch so
Graphain
3
Ich bin froh, dass es nicht so ist, da es den Grund von OOP zerstört. Da jede Methode standardmäßig virtuell ist, können Sie grundsätzlich Ihre gesamte Klasse ersetzen, was Sie normalerweise nicht möchten. Wenn Sie eine Methode von "nicht endgültig" auf "endgültig" ändern, kann der abgeleitete Code beschädigt werden, während dies auf die andere Weise nicht der Fall ist.
Femaref
0

Ich denke, deine Frage ist subjektiv. Hier kann nicht alles erklärt werden. Ich empfehle Ihnen, Java Puzzlers , By zu lesen Joshua Bloch and Neal Gafter. Sie können mehr lernen und vor Fallstricken sicher sein.


quelle
Nicht alle Fallstricke, aber Fallstricke, die C # -Programmierer sind, werden wahrscheinlich in Java auftreten :)
Vimvq1987
1
@ Vimvq1987 - Es gibt keinen Grund anzunehmen, dass Sie nach dem Wechsel zu Java nicht auf die Fallstricke von "Java Puzzlers" stoßen.
Stephen C
-1

In der Java-Sprache sind die objektiven Äquivalente primitiver Typen wie int, char keine "Werttypen" (z. B. Integer ist ein Referenztyp). In C # ist das System.Int32 eine Struktur.


quelle