C#からJavaに切り替えて、気にする必要がある「落とし穴」はどれですか。


9

新しいプロジェクトではJavaに切り替えなければならない場合があります。私はJavaについてほとんど知識がありません。私は主にC#を研究して使用しており、これら2つの言語/プラットフォームの違いが多くの問題を引き起こす可能性があることを恐れています。

私が気にする必要がある落とし穴/落とし穴はどれですか?


私はこのブログがあなたが探している多くのものをカバーしていると思います。ericsink.com/entries/java_eclipse_2.html
Hari Menon

3
C#とJavaの間には多くの違いがあり、どれもこの質問に対する潜在的な「答え」です。しかし、それがあなたや他の人にとても役立つとは思えません。より具体的で実際の質問をすると、より役立つ回答が得られます。あるいは、(事実上無限の)違いではなく、C#からJavaに切り替えるためのリファレンスまたはガイドを求めてみてください。

言い換えれば、代わりに特定の問題について「なぜ」または「どのように」の質問をしてみてください。たとえば、リファレンス、ガイド、または本を求めることは、「C#からJavaに切り替えるにはどうすればよいのか」、または理解できない特定のコードについて尋ねるのは「なぜYではなくXを実行するのか」という質問のようなものです。

このコミュニティWikiを作成することを検討してください
finnw 2010

回答:


36

C#からのJavaの落とし穴は次のとおりです。

  • Javaでは、switchケースが静かに次へとフォールスルーする可能性があるため、break適切な場合は常に置くようにしてください。また、JavaでswitchオンStringにすることもできません。
  • ジェネリックスは、参照タイプでのみ具体化およびパラメーター化できません。何もありませんList<int>、のみList<Integer>。自動NullPointerExceptionボックス化は冗長性を非表示にしますが、をボックス化解除すると取得できますnull。また、==そして!=2つの箱入りプリミティブ型の参照比較を行います。
    • ...ので、==および!=2つの参照型(たとえば上でString常に参考比較されています)
    • intにautoboxedすることができますInteger。からint[]へのオートボクシングはありませんInteger[]
  • Javaのbyteshortintlongのみ署名されています。意図しない符号拡張に注意してください。
  • 多次元配列ではなく、Javaの配列の配列のみ。
  • ほとんどのsub*範囲クエリメソッドは、包括的下限と排他的上限を使用します

こちらもご覧ください

関連する質問

上記のいくつかのトピックについて:

一般的なJavaの落とし穴:


8
今、あなたは、Java SE 7で文字列に切り替えることができます
マルコム

Genericsの +1 は非参照であり、参照型のみパラメーター化できます。これは今日私に大いに役立ちました
cctan

また、javaには構造体がありません。

13

明らかな落とし穴の1つはstring1 == string2、JavaスタイルではなくC#スタイル(Javaは参照のみを比較する)で文字列を比較することstring1.equals(string2)です。

もう1つは、JavaのprivateC#のデフォルトのアクセス修飾子ですpackage

また、ToString()メソッドはJavaの現在のカルチャによって自動的にローカライズされません。


これは、オペレーターのオーバーロードがないという事実の延長です。
Graphain 2010

3
違う。Package-privateはJavaのデフォルトのアクセス修飾子です。
Oliver Weiler、2010

@ヘルパーメソッド:すみません。つまり、C#はデフォルトでプライベートでしたが、Javaではありませんでした。これで編集されました。

12

私を得たものは、Javaの部分文字列の引数がbeginIndex、endIndexであるのに対し、C#のSubtringの引数はstartIndex、長さです。それはそれを煩わしくするのに十分な違いであり、どちらの方法で切り替えてもインデックスが範囲外になる可能性は十分にあります。


3
+1さらに混乱するのは、beginIndex INCLUSIVEとendIndex EXCLUSIVE ...であり、startIndex、lengthアプローチを使用するJDKのAPIがいくつかあるという事実です
Oliver Weiler

10
  • あなたはLINQを取得しません
  • 良くない-見栄えのUI(WPFなし)
  • プロパティなし
  • あなたはエジプト人を踊ります
  • 例と優れたドキュメントなしでAPIを取得します

うーん。


2
Java APIが悪いことに気づいたことはありませんが(実際にはナビゲートしやすい)、間違いなく例が少なくなっています。エジプト人についてこれは何ですか?
Graphain 2010

3
私はこれを賛成しています……皮肉なローブローであっても。
mpen 10/07/15

3
@Graphainは、stackoverflow.com

8
これらは本当の落とし穴ですか?バグの原因として考えられる落とし穴を理解しています。これらは、他の方法ではできないので、一緒に暮らさなければならないものです。

2
@cloudanger:同意してください。落とし穴は、正しく機能しないものではなく、正しく機能しないものでなければなりません。
Vimvq1987 2010

10
  • Java列挙型はより強力で複雑です。名前付き整数ではなく、実際には実際のクラスです。
  • Javaの内部クラスはより強力です(そしてそれらは異なる動作をします)
  • デリゲートなし、機能オブジェクトのみ
  • ものを連鎖させるコンストラクタは両方の言語で完全に異なる構文を持っています、私はそれをC#で行う必要があるたびに失敗する傾向があります
  • Javaは、サブクラス化のために拡張され、インターフェースのために実装されています。代わりにC#は、インターフェイスが名前の大文字のIで始まるという命名規則を中継します。他の誰かが失敗したかどうか確信が持てないので、私はその慣習は好きではありません。
  • java autoboxingはa **であなたを噛むことができます
  • Java型の消去は本当に事をより複雑にします

2
冗談だよね?ただし、-1。あなたは真剣にすることはできません。

3
あなたは少なくともあなたが好きではない点を明確にすべきです、そうでなければ私はあなたがただトローリングしていると仮定しなければなりません。
アタマンロマン2010

2
冗談であるだけでなく無知でもあります。linuxはバックエンド領域で重要です。javadocは、これらの愚かなmsヘルプファイルよりもはるかにクリーンで、ネットワーク共有から表示すると機能しません。サンドキャッスルはほとんど文書化されておらず、適切なGUIがなければ完全に使用できません。ほとんどのPPLは、Javaフレームワークに本当に素晴らしいコレクションがあり、ジョシュアブロフが素晴らしい仕事をしたことに同意します。そして、「egghead」の本はあなたが理解できない本にすぎません。Eclipseは素晴らしいIDEであり、VSは外部プラグインなしでは我慢できません。ところで:私はC#が好きで、Javaのlinqが恋しいです。ms-office-worldから抜け出します。
アタマンロマン2010

1
これらのアイテムの1つだけが
落とし穴です

1
-1私からも、良いideが何であるかがわかりません(したがって、プログラミングに関連することのほとんどを知りません)。編集:Pffft Javaはより成熟し、Javaには実際のジェネリックすらありません

6

最大のメタ落とし穴は、Java言語とライブラリがC#の類似したものと同じように動作すると想定することです。チュートリアルを実行し、javadocsを読んで、想定しないでください...

もう1つのメタ落とし穴は、Java でC#と同じくらい簡単に/うまくできる/ できるという事実を想定していることです。それは本当ではない。Javaははるかに古い言語であり、間違いがあった...

そして最後のメタ落とし穴は、SO上のJavaで欠けている/異なるものについて不平を言う、普遍的に共感的/支持的な応答が得られると考えることです!


3

デフォルトのアクセス修飾子の違いに注意してください。また、Javaの非静的メソッドはすべて仮想であることに注意してください(最終メソッドとしてマークしない限り)。

少し古くなっていますが、これは素晴らしいリファレンスであることがわかりました。

Dare ObasanjoによるC#とJavaの比較


3
Also note that all non-static methods in Java are virtual.C#もこのようにしたいと思います
Graphain 2010

3
それがOOPの理由を破壊するので、そうではなくてうれしいです。デフォルトではすべてのメソッドが仮想であるので、基本的にクラス全体を置き換えることができますが、これは通常は必要ありません。また、メソッドをnon-finalからfinalに変更すると、派生コードが破損する可能性がありますが、他の方法では破損しません。
Femaref 2011


0

あなたの質問は主観的だと思います。ここではすべてを説明することはできません。Java Puzzlers By を読むことをお勧めしますJoshua Bloch and Neal Gafter。あなたはもっと学び、落とし穴から安全になることができます。


すべての落とし穴ではなく、C#プログラマである落とし穴がJavaで発生する可能性があります:)
Vimvq1987

1
@ Vimvq1987-Javaに切り替えた後に「Java Puzzlers」の落とし穴に遭遇しないと仮定する理由はありません。
スティーブンC

-1

Java言語では、int、charなどのプリミティブ型に相当する客観的なものは「値型」ではありません(たとえば、整数は参照型です)。C#では、System.Int32は構造体です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.