7

質問にあるように、C++ プログラマーが Java に切り替えるときに直面する一般的/主要な問題は何ですか? 私は、エンジニアが行わなければならなかったいくつかの広範なトピック名または例、および日々の調整を探しています。次に、これについて詳しく読むことができます。

C++ を何年も使用し、Java を使用する必要があったエンジニアの意見に特に関心がありますが、他の人からの指針や書籍の推奨事項も大歓迎です。

4

14 に答える 14

15
  • C++ では、デストラクタを使用して、ファイル記述子やデータベース接続などをクリーンアップします。単純な同等物は、ファイナライザーを使用することです。しないでください。これまで。

代わりに、次のパターンを使用します。

OutputStream os;
try {
  os = ... 
  // do stuff
} finally {
  try { os.close(); } catch (Exception e) { }
}

あなたはそのようなことをたくさんすることになります。

  • アクセス修飾子を指定しない場合、Java では、メンバがプライベートである C++ とは異なり、デフォルトで package-private になります。Package-private は迷惑なアクセス レベルであり、プライベートであることを意味しますが、同じパッケージ内のすべてのものもアクセスできます (これはばかげたデフォルトのアクセス レベルです)。
  • スタック/ヒープの分離はありません。すべてがヒープ上に作成されます (厳密にはそうではありませんが、そうであると仮定します)。
  • 参照渡しはありません。
  • 関数ポインターに相当するものは匿名インターフェイスです。
于 2009-01-11T22:36:42.047 に答える
7

C++ から Java に移行する際の最大のハードルは、手続き型コードを捨てることでした。私は、プロシージャ内ですべてのオブジェクトを結び付けることに非常に慣れていました。Java の手続き型コードがなければ、どこでも循環参照を作成しました。オブジェクトが相互に依存することなく、オブジェクトからオブジェクトを呼び出す方法を学ばなければなりませんでした。それは最大のハードルでしたが、克服するのが最も簡単でした.

2番目の個人的な問題はドキュメンテーションです。JavaDoc は便利ですが、多くの Java プロジェクトにとって、必要なのは JavaDoc だけであるという誤解があります。C++ プロジェクトで、はるかに優れたドキュメントを見ました。これは、コード外のドキュメントに対する個人的な好みかもしれません。

番号3.実際にはJavaにはポインターがありますが、ポインター演算はありません。Java では、参照と呼ばれます。物事が指している場所を無視できるとは思わないでください。大きなバイトで戻ってきます。

  • == と .equals は等しくありません。

  • == はポインター (参照) を調べ、.equals は参照が指している値を調べます。

于 2009-01-11T22:45:03.590 に答える
5

ジェネリクス(テンプレートの代わり)、具体的にはタイプ erasureを使用して実装された方法。

于 2009-01-11T22:39:48.843 に答える
5

コピーコンストラクターを考えていたときに誤って参照を作成する:

myClass me = new myClass();
myClass somebodyElse = me; /* A reference, not a value copied into an independent instance! */
somebodyElse.setPhoneNumber(5551234);
/* Hey... how come my phone doesn't work anymore?!?!?  */
于 2010-02-24T23:53:53.953 に答える
5

あなたは本の推奨事項に言及しているので、 Effective Java, 2nd edを必ず読んでください。—回答に記載されている落とし穴のほとんどに対処します。

于 2009-01-11T23:22:45.137 に答える
4
  • 多重継承はなく、すべてのクラスは java.lang.Object から暗黙的に派生します (これには、必ず知って理解しなければならない重要なメソッドが多数あります)。
  • インターフェイスを実装することで、一種の多重継承を行うことができます
  • 「+」(文字列用)以外の演算子のオーバーロードはありません。間違いなく、自分でできることはありません
  • 実際には数値型として使用されるべきではない char を除いて、符号なしの数値型はありません。署名されていない型を処理する必要がある場合は、多くのキャストとマスキングを行う必要があります。
  • 文字列は null で終わるのではなく、char 配列に基づいているため、不変です。この結果、ループ内で += を追加して長い文字列を作成すると O(n^2) になるため、実行しないでください。代わりに StringBuilder を使用してください。
于 2009-01-12T01:18:59.617 に答える
3

ガベージコレクターを持つことに慣れる。GC が処理しないリソースをクリーンアップするためにデストラクタに頼ることができない。

オブジェクトではなく参照が渡されるため、すべてが値渡しされます。

複製する必要がない限り、コピーコンストラクターはありません。代入演算子はありません。

すべてのメソッドはデフォルトで仮想です。これは C++ とは逆です。

インターフェイスの明示的な言語サポート - C++ の純粋仮想クラス。

于 2009-01-11T22:27:05.187 に答える
2

私の最悪の問題は、常にメモリの所有権を念頭に置くことでした。C ++では、これを行う必要があり、開発者の心に克服するのが難しいいくつかのパターンが作成されます。Javaでは、それを(とにかく非常に高度に)忘れることができます。これにより、C++では非常に厄介ないくつかのアルゴリズムとアプローチが可能になります。

于 2009-01-12T17:45:22.620 に答える
2

Java にはオブジェクトはなく、オブジェクトへの参照のみがあります。例:

MyClass myClass;   // no object is created unlike C++.

しかし :

MyClass myClass = new MyClass();   // Now it is a valid java object reference.
于 2010-02-25T00:09:09.603 に答える
1

私が読んだ Java の「落とし穴」に関する最高の本はJava Puzzlers: Traps, Pitfalls, and Corner Casesです。特にC++ 開発者を対象としているわけではありませんが、注目すべき例がたくさんあります。

于 2009-01-11T23:32:48.143 に答える
0

メソッド パラメーターを final として指定しても、最初は意味があるとは限りません。

private void doSomething(final MyObject myObj){
   ...
   myObj.setSomething("this will change the obj in the calling method too");
   ...
}

Javaは値渡しであるため、Javaがオブジェクトではなく参照の値を渡す方法を理解していない限り、すぐにはわかりません。

于 2010-02-25T00:41:40.470 に答える
0

もう 1 つの注目すべきキーワードはfinalandconstです。Java は const を予約済みキーワードとして定義していますが、その使用法の多くを指定していません。また

object1=object2

参照を変更するオブジェクトをコピーしません

于 2013-10-25T18:58:24.080 に答える
0

すべてのメソッドは仮想です。

パラメーター化された型 (ジェネリック) は、実際にはコード パラメーター固有のコードを作成しません (つまり、コンパイラーList<String>と同じバイトコードを使用するのは、前者List<Object>;に を入れようとすると不平を言う唯一のものです)。Integer

可変引数は簡単です。

于 2009-01-12T01:07:07.673 に答える