你的浏览器还没开启 Javascript 功能!

Javaと.NETの特性を比較してみた

前説

この記事を書く意図はJavaと.NETを比較することで技術の優劣をつけることではありません。
エンジニア界隈では言語対して、往々にして宗教戦争があります。Javaのエンジニアは.NETがWindowsしか乗らないとディスったり、.NETのエンジニアはJavaは書き方がうるさいと愚痴ったりします。そういう争いは生産性がなく、無意義と考えています。

この記事を書くことで双方の言語体系、Webフレームワーク、デプロイ方法を比較することで片方しか経験していないエンジニアがもう片方の技術特性を理解に役立てれば幸いです。

開発ツール

工、その事をよくせんと欲せば、必ずその器を利とす。(職人が立派な仕事をしたいと思ったらまず道具を研ぐ)。

まずは開発に欠かせないツールについて説明します。

フレームワークツール解説
.NETVisual Studio, Visual Studio Code, RiderMicrosoftの公式IDEのVisual Studioは.NETの全プラットフォームに対応できる。
JavaIntellij, Eclipse, Visual Studio Codeコードの実行とデバッグの役割、JDKに依存する
JavaMavan, Gradleテンプレート管理、パッケージングの役割。JDKに依存する
JavaJDKコンパイルと実行(Runtime)の役割を持つ

.NETはVisual Studio(以後VSと略す)をインストールすれば開発に着手できる。JavaはIDEだけインストールしては駄目で、JDKやMavenをインストールして設定しなければいけない。JDKとMavenを自動的にインストールしてくれるIDE(Intellij)あるが、なるべく自分でインストールして設定したほうが良い。そうじゃないと意味のわからない地雷を踏むことになる。

環境構築の手軽さだけで言うなら.NETに軍配が上がる。頭を使わず次へ次へとポチポチすればいい。Javaはまずはツールの特性と責務を理解して設定する必要がある。

初心者にとってJavaの最初の関門を少し狭く感じるかもしれません。しかし、Javaは環境構築に苦労するぶん、プロジェクトの仔細がわかるようになる。

まぁ、どちらもVisual Studio Code(以後Vscodeと略す)を使って開発できるので、技術を体系的に理解する目的なら環境構築はVscodeを推奨する。

次に各種ツールをもう少し詳細的に説明します。

責務.NETJava解説
プロジェクト管理VS,Vscode,RiderIntellij, Eclipse, VscodeVscode使ってるぶん大差ない、課金してIdeaやRiderを買ったほうが少し効率上がる。Eclipseはゴミ
テンプレート管理IDE+MSBuild or IDE+SDKIDE+Maven or IDE+Gradle.NETプロジェクトはsln+csprojファイルで構成される。Javaはpom.xmlファイルで構成される。
コンパイル・デバッグIDE+MSBuild+SDK or IDE+SDKIDE+Maven+SDK or IDE+Gradle+SDK.NETコンパイラは独立してる。 JavaのコンパイラはJDKに統合されており、Mavenプロジェクトはpom.xmlで構成されているが、コンパイラはpom.xmlを認識しないため、コンパイルするにはMavenが必要
パッケージ管理NugetMavan, GradleNugetは簡単。JavaのMavanやGradleは柔軟で強力。
パッケージング・デプロイIDE+MSBuild+SDK or IDE+SDKIDE+Maven+SDK or IDE+Gradle+SDK.NETコンパイラは独立してる。 JavaのコンパイラはJDKに統合されており、Mavenプロジェクトはpom.xmlで構成されているが、コンパイラはpom.xmlを認識しないため、パッケージするにはMavenが必要。

.NETのSDKが提供されてくれる豊富なテンプレートは簡単で使いやすい。JavaのMavenは柔軟で強力だが、複数プロジェクト管理は.NETより不便に感じる。

この差はコンパイラとテンプレートから来てる。

Javaプロジェクトには公式な標準テンプレートがないため、IDEはプロジェクトのフォルダ整理くらいしかしてくれません。そのぶん自分で任意のディレクトリをSourceRootやResourceRootに決めたりでき、非常に柔軟性に優れています。しかし、柔軟がゆえにチーム開発においてプロジェクト管理の負担が増えるデメリットにもなる。まぁ、MavenやGradleのおかげでJavaのカオス時代は終焉しました。

言語の特性

分類.NETJava
クラス構成namespace : 命名空間と実際のディレクトリ構成と一致しなくても構わないPackage : 命名空間とディレクトリは一致せなばならん
クラスcsファイル : クラス名とファイル名は一致しなくてもOKjavaファイル : クラス名とファイル名は一致しなくてもOK、だたし、1つのクラスで定義できるpublicクラスは1つのみ
コンパイル出力.dll, .exeファイル.jar, .warファイル

Webフレームワーク

.NETのWebフレームワークはMicrosoft公式のものがデファクトスタンダードです。Javaは公式のServlet APIあるが、デファクトスタンダードはSpringです。MVCフレームワークで比較して行きたいと思います。

機能.NETJava解説
コア機能ASP.NETServlet
MVCフレームワークASP.NET MVCSpring MVC
テンプレートエンジンRazorThymeleafRazorは直感的で使いやすい、Springはテンプレートエンジンの提供がなく、MavenからThymeleafを入れられる
データ永続層Entity FrameworkHibernate or MyBatisEFは簡単で習得しやすい。JavaのHibernateは簡単だけど癖がある、 MyBatisはゴリゴリSQL書く必要がある。

.NETのWebフレームワークは最初からテンプレートエンジンやデータ永続層を提供してくれるので理解しやすく習得が早い。JavaのWebフレームワークはテンプレートエンジンとデータ永続層は選択肢が豊富でプロジェクトの特性に合わせて柔軟に構成できます。Javaのデータ永続層に関して欧米ではHibernateが人気、アジア圏はMyBatisの使用者が多い。(※Googleドレンド調べ)

個人的にデータ永続層なら.NETのEntity FrameworkはHibernateとMyBatisのいいとこ取りして、使ってて心地よい。

デプロイ

.NET Coreのおかげで.NETはやっとWindowsのみの呪縛から開放され、選択肢が増えて非常に喜ばしい。正直、デプロイに関してはもはや.NETもJavaも大差ない。

責務.NETJava
OSWindow, LinuxWindows, Linux
WebサーバーIIS, KestrelTomcat

IISはGUIなので簡単にデプロイできるが、Windowsでしか使えない難点がある。

まとめ

Javaも.NETも各々の良さがあり、優劣をつけられるものではありません。

フレームワークは所詮手段に過ぎず、両方のフレームワークの特性を理解することで目的を達成するための最適な選択ができるようになります。

しかし、生態圏でいうとJavaのほうが圧倒的に有利です。コミッターの数も.NETの比ではない。
私は.NET畑出身なので、どうしても.NETに愛着がわきます。でも、仮に「新人にNETとJavaどっち勉強したほうがいい?」って聞かれたら、「Windowsに拘らなければJavaのほうがいいよ」とJavaを勧めます。

結局技術は一時的なものでで、生態圏は永遠です。PHPが未だに現役なのもこのためです。