質問にあるように、C++ プログラマーが Java に切り替えるときに直面する一般的/主要な問題は何ですか? 私は、エンジニアが行わなければならなかったいくつかの広範なトピック名または例、および日々の調整を探しています。次に、これについて詳しく読むことができます。
C++ を何年も使用し、Java を使用する必要があったエンジニアの意見に特に関心がありますが、他の人からの指針や書籍の推奨事項も大歓迎です。
質問にあるように、C++ プログラマーが Java に切り替えるときに直面する一般的/主要な問題は何ですか? 私は、エンジニアが行わなければならなかったいくつかの広範なトピック名または例、および日々の調整を探しています。次に、これについて詳しく読むことができます。
C++ を何年も使用し、Java を使用する必要があったエンジニアの意見に特に関心がありますが、他の人からの指針や書籍の推奨事項も大歓迎です。
代わりに、次のパターンを使用します。
OutputStream os;
try {
os = ...
// do stuff
} finally {
try { os.close(); } catch (Exception e) { }
}
あなたはそのようなことをたくさんすることになります。
C++ から Java に移行する際の最大のハードルは、手続き型コードを捨てることでした。私は、プロシージャ内ですべてのオブジェクトを結び付けることに非常に慣れていました。Java の手続き型コードがなければ、どこでも循環参照を作成しました。オブジェクトが相互に依存することなく、オブジェクトからオブジェクトを呼び出す方法を学ばなければなりませんでした。それは最大のハードルでしたが、克服するのが最も簡単でした.
2番目の個人的な問題はドキュメンテーションです。JavaDoc は便利ですが、多くの Java プロジェクトにとって、必要なのは JavaDoc だけであるという誤解があります。C++ プロジェクトで、はるかに優れたドキュメントを見ました。これは、コード外のドキュメントに対する個人的な好みかもしれません。
番号3.実際にはJavaにはポインターがありますが、ポインター演算はありません。Java では、参照と呼ばれます。物事が指している場所を無視できるとは思わないでください。大きなバイトで戻ってきます。
== と .equals は等しくありません。
== はポインター (参照) を調べ、.equals は参照が指している値を調べます。
ジェネリクス(テンプレートの代わり)、具体的にはタイプ erasureを使用して実装された方法。
コピーコンストラクターを考えていたときに誤って参照を作成する:
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?!?!? */
あなたは本の推奨事項に言及しているので、 Effective Java, 2nd edを必ず読んでください。—回答に記載されている落とし穴のほとんどに対処します。
ガベージコレクターを持つことに慣れる。GC が処理しないリソースをクリーンアップするためにデストラクタに頼ることができない。
オブジェクトではなく参照が渡されるため、すべてが値渡しされます。
複製する必要がない限り、コピーコンストラクターはありません。代入演算子はありません。
すべてのメソッドはデフォルトで仮想です。これは C++ とは逆です。
インターフェイスの明示的な言語サポート - C++ の純粋仮想クラス。
私の最悪の問題は、常にメモリの所有権を念頭に置くことでした。C ++では、これを行う必要があり、開発者の心に克服するのが難しいいくつかのパターンが作成されます。Javaでは、それを(とにかく非常に高度に)忘れることができます。これにより、C++では非常に厄介ないくつかのアルゴリズムとアプローチが可能になります。
Java にはオブジェクトはなく、オブジェクトへの参照のみがあります。例:
MyClass myClass; // no object is created unlike C++.
しかし :
MyClass myClass = new MyClass(); // Now it is a valid java object reference.
私が読んだ Java の「落とし穴」に関する最高の本はJava Puzzlers: Traps, Pitfalls, and Corner Casesです。特にC++ 開発者を対象としているわけではありませんが、注目すべき例がたくさんあります。
メソッド パラメーターを final として指定しても、最初は意味があるとは限りません。
private void doSomething(final MyObject myObj){
...
myObj.setSomething("this will change the obj in the calling method too");
...
}
Javaは値渡しであるため、Javaがオブジェクトではなく参照の値を渡す方法を理解していない限り、すぐにはわかりません。
もう 1 つの注目すべきキーワードはfinal
andconst
です。Java は const を予約済みキーワードとして定義していますが、その使用法の多くを指定していません。また
object1=object2
参照を変更するオブジェクトをコピーしません
すべてのメソッドは仮想です。
パラメーター化された型 (ジェネリック) は、実際にはコード パラメーター固有のコードを作成しません (つまり、コンパイラーList<String>
と同じバイトコードを使用するのは、前者List<Object>;
に を入れようとすると不平を言う唯一のものです)。Integer
可変引数は簡単です。