聞かれたので自分の思う所を書いてみる。
- 基本オブジェクト(クラスで書ける物)が.NET Frameworkではアクティブオブジェクトであり、Javaはパッシブオブジェクトである。(端的に言えば delegate/event の有無だけどモデリングの観点ではまったく違うはずで別物である)
- アクセサは.NET Frameworkではプロパティで表現される。Javaではアクセサメソッドを定義する。
両言語をフィールドを公開するのは御法度と言う視点で見れば、.NET Framework は真にオブジェクト(属性と振る舞いのペア)であるが、Javaはサービス(属性なぞは存在せず、属性の変わりにサービスメソッドの引数であり戻り値が利用される)である。
- C#はOSネイティブの環境で動作する(P/InvokeでAPIを呼ぶ事もできる、その他基本的にInterOpを重視する)、JavaはクローズなVM内で動作し基本としてInterOpをしない(JNI等によってAPIには出られるが基本御法度)
- .NET Frameworkには参照型と値型がある、値型の振る舞いはJavaの基本型と同様だが、.NET Frameworkでは値型を任意に追加定義できるが、Javaでは追加できない。
C 風のstruct Array を.NETでは作れるがJavaでは作れない(見た目としては作れるが物理レイアウトとしては作れない)このため、Javaは座標のリスト等、小さなオブジェクトの列を扱うのが苦手だったはず(安易にやるとGCイジメになりやすい)
Javaはまったくやらないので良くわからんけど自分の理解としてはこんな感じ。
優劣はそもそも動作プラットフォームが違うので比較する意味が無い、プラットフォームにWindows を使うのであれば .NET だろうし、他を使うのであれば Java がいいのではなかろうか。値型の効果が出そうなら.NETが良いかもといえるが、JavaでもFlyweight等のパターンを使えば問題にならない実装とする事ができたはずなので、結局は腕の問題。
ちなみに「XMLパーサのバージョン地獄+あちこちのお手製フレームワークが色々別のXMLパーサバージョンを要求して現場で動く組み合わせが無い+数百万円のサーバでJavaを使ったXML処理がMSXMLを使ったVBアプリにいとも簡単に鴨られる」とか色々あった時期のトラウマが残っていますのでJavaなシステムを私に振らないで下さい。