Passer de C # à Java, quels «accrochages» dois-je faire?

9

Je vais peut-être devoir passer à Java pour un nouveau projet. J'ai très peu de connaissances sur Java, car j'ai principalement étudié et utilisé le C #, et j'ai peur que les différences entre ces deux langages / plateformes ne me causent de nombreux problèmes.

Quels sont les pièges / pièges dont je devrais me soucier?

Vimvq1987
la source
Je pense que ce blog couvre beaucoup de choses que vous recherchez. Ericsink.com/entries/java_eclipse_2.html
Hari Menon
3
Il existe de nombreuses différences entre C # et Java et chacune d'entre elles est une "réponse" potentielle à cette question. Cependant, je doute que ce serait très utile pour vous ou pour d'autres. Poser une question plus précise et réelle donnerait des réponses plus utiles. Sinon, essayez de demander des références ou des guides pour passer de C # à Java plutôt que les différences (effectivement infinies).
En d'autres termes, essayez plutôt de poser une question «pourquoi» ou «comment» sur un problème spécifique. Par exemple, demander des références, des guides ou des livres, c'est comme demander "comment puis-je passer de C # à Java", ou poser des questions sur du code spécifique que vous ne comprenez pas est une question "pourquoi cela fait-il X au lieu de Y".
Pensez à créer ce wiki communautaire
finnw

Réponses:

36

Voici quelques pièges Java importants en provenance de C #:

  • En Java, les switchcas peuvent passer silencieusement au suivant, alors assurez-vous de toujours les mettre breakchaque fois que cela est approprié. Vous pouvez pas non plus switchsur StringJava.
  • Les génériques sont non réifiés et paramétrables avec des types de référence uniquement. Il n'y a pas List<int>, seulement un List<Integer>. La boîte automatique masque la verbosité, mais vous pouvez l'obtenir NullPointerExceptionlors du déballage null. En outre, ==et !=sur deux types primitifs encadrés, effectuez une comparaison de référence.
    • ... car ==et !=sur deux types de référence (par exemple String) sont toujours la comparaison de référence
    • Un intpeut être placé automatiquement dans un Integer; il n'y a pas de boîte automatique de int[]à Integer[].
  • De Java byte, short, int, longsont signés seulement. Surveillez l'extension de signe involontaire.
  • Pas de tableaux multidimensionnels, uniquement un tableau de tableaux en Java.
  • La plupart sub*des méthodes de requête à distance utilisent une borne inférieure inclusive et une borne supérieure exclusive

Voir également

Questions connexes

Sur certains sujets énumérés ci-dessus:

Sur les pièges Java généraux:

polygénelubrifiants
la source
8
Vous pouvez maintenant activer String dans Java SE 7.
Malcolm
+1 pour les génériques n'est pas réifié et paramétrable avec les types de référence uniquement , cela m'a beaucoup aidé aujourd'hui
cctan
Vous devez également ajouter que java n'a pas de structure.
13

Un écueil évident consiste à comparer les chaînes avec le style C # string1 == string2(Java compare uniquement les références) au lieu du style Java string1.equals(string2).

Un autre est que privatec'est le modificateur d'accès par défaut en C #, packageen Java.

De plus, les ToString()méthodes ne sont pas automatiquement localisées par la culture actuelle en Java.

Cloudanger
la source
Ceci est une extension du fait qu'il n'y a pas de surcharge d'opérateur.
Graphain
3
Faux. Package-private est le modificateur d'accès par défaut de Java.
Oliver Weiler
Méthode @Helper: Oh, désolé. Je voulais dire que C # avait privé par défaut, mais pas Java. Il est maintenant modifié.
12

Celui qui m'a obtenu était les arguments de sous-chaîne Java sont beginIndex, endIndex tandis que les arguments de sous-chaîne C # sont startIndex, longueur. C'est assez de différence pour le rendre ennuyeux et une bonne probabilité de sortir l'index hors des limites dans les deux cas.

krock
la source
3
+1 Plus déroutant est le fait que c'est beginIndex INCLUSIVE et endIndex EXCLUSIVE ... et qu'il y a des API trouvées dans le JDK qui utilisent l'approche startIndex, length ...
Oliver Weiler
10
  • Vous n'obtenez aucun LINQ
  • Vous n'obtenez pas une belle interface utilisateur (pas de WPF)
  • Aucune propriété
  • Vous obtenez des Egyptiens dansants
  • Vous obtenez des API sans exemples et une bonne documentation

Hm.


la source
2
Jamais trouvé l'API Java mauvaise (en fait plus facile à naviguer) mais il y a définitivement moins d'exemples. Qu'est-ce que cela concerne les Égyptiens?
Graphain
3
Je vote pour ... ... même si c'est un coup bas sarcastique.
mpen
8
S'agit-il de véritables pièges? Je comprends les pièges comme des causes possibles de bugs. Ce ne sont que des choses avec lesquelles vous devez vivre car vous ne pouvez pas faire autrement.
2
@cloudanger: d'accord avec vous. Les pièges devraient être des choses qui "fonctionnent" mal, pas des choses qui ne fonctionnent même pas.
Vimvq1987
10
  • Les énumérations Java sont beaucoup plus puissantes / compliquées, ce sont en fait de vraies classes au lieu d'entiers nommés.
  • les classes internes en java sont plus puissantes (et elles se comportent différemment)
  • pas de délégués, seulement des objets fonctionnels
  • le constructeur enchaînant quelque chose a une syntaxe complètement différente dans les deux langues, j'ai tendance à échouer à chaque fois que je dois le faire en c #
  • Java a des extensions pour le sous-classement et implémente des interfaces, ce qui est plutôt bien. C # s'appuie à la place sur une convention de dénomination qui dit que les interfaces commencent par un I majuscule dans leur nom. Je n'aime pas cette convention, car je ne peux jamais être sûr si quelqu'un d'autre échoue.
  • java autoboxing peut vous mordre dans le **
  • l'effacement de type java rend vraiment les choses plus compliquées
atamanroman
la source
2
Tu rigoles pas vrai? -1, cependant. Tu ne peux pas être sérieux.
3
vous devez au moins préciser quel point vous n'aimez pas, sinon je dois supposer que vous êtes juste à la traîne.
atamanroman
2
Maintenant, non seulement vous plaisantez, mais vous êtes juste ignorant: Linux EST important dans la zone backend, javadoc est beaucoup plus propre que ces fichiers d'aide ms stupides qui ne fonctionneront pas si vous les visualisez à partir de partages réseau. le château de sable n'est presque pas documenté et complètement inutilisable sans une interface graphique appropriée. la plupart des gens conviendront qu'il y a de très belles collections dans le framework java et joshua bloch a fait du bon travail là-bas. Et les livres "egghead" ne sont que des livres que vous ne comprenez pas. Eclipse est un IDE génial que VS ne peut pas supporter sans plugins externes. Btw: J'aime C # et mademoiselle linq en java. Sortez de votre monde ms-office.
atamanroman
1
Un seul de ces articles est un gotcha
finnw
1
-1 de moi aussi, vous ne savez pas ce qu'est une bonne idée (et donc vous ne savez pas grand chose de la programmation). Edit: Pffft Java plus mature, Java n'a même pas de vrais génériques ..
6

Le plus grand méta-écueil est de supposer que le langage Java et les bibliothèques se comportent de la même manière que des éléments d'aspect similaire en C #. Faites les tutoriels, lisez les javadocs, ne partez pas du principe ...

Un autre méta-écueil consiste à supposer que le fait que vous puissiez faire quelque chose en Java aussi facilement / joliment que vous pouvez / pourriez en C #. Ce n'est pas vrai. Java est un langage beaucoup plus ancien, et des erreurs ont été commises ...

Et le dernier méta-écueil est de penser que se plaindre de choses manquantes / différentes dans Java sur SO vous donnera des réponses universellement sympathiques / favorables!

Stephen C
la source
3

Méfiez-vous des différences dans les modificateurs d'accès par défaut. Notez également que toutes les méthodes non statiques de Java sont virtuelles (sauf si vous les marquez comme finales).

Bien qu'il soit quelque peu dépassé, j'ai trouvé que c'était une excellente référence.

Comparaison de C # et Java, par Dare Obasanjo

user5631
la source
3
Also note that all non-static methods in Java are virtual.Comment j'aimerais que C # soit comme ça aussi
Graphain
3
Je suis content que ce ne soit pas le cas, car cela détruit la raison de la POO. Avec chaque méthode étant virtuelle par défaut, vous permettez à votre classe d'être remplacée, ce que vous ne voulez généralement pas. De plus, changer une méthode de non-final en final peut casser le code dérivé, contrairement à l'autre.
Femaref
0

Je pense que votre question est subjective. Tout ne peut pas être expliqué ici. Je vous suggère de lire Java Puzzlers , By Joshua Bloch and Neal Gafter. Vous pouvez en savoir plus et être à l'abri des pièges.


la source
pas tous les pièges, mais les pièges qui sont programmeurs C # sont susceptibles de faire, en Java :)
Vimvq1987
1
@ Vimvq1987 - il n'y a aucune raison de supposer que vous ne rencontrerez pas les pièges "Java Puzzlers" après être passé à Java.
Stephen C
-1

En langage Java, les équivalents objectifs des types primitifs tels que int, char, ne sont pas des "types de valeur" (par exemple, Integer est un type de référence). En C #, System.Int32 est une structure.


la source