我從 C# 轉寫 Java,結果三觀全碎:這些 Java 的編譯設計真的離譜

| Unclassified | 4 Reads

前言:一個 C# 工程師的震撼教育

作為一名 .NET/C# 工程師,我原本以為 Java 應該差不多也有現代建構體驗,像是:

  • 自動編譯

  • 一鍵產出 .exe.jar

  • 自動解析依賴與順序

  • 編譯器智能又體貼

結果實際上手後,我只能說:這一切根本是美好幻想。


🔥 震驚事實 #1:javac 僅僅只是個編譯器

沒錯,它就只會把 .java 編成 .class完全不管打包、不管依賴、不管順序、不給提示

C# 的 dotnet build 幫你處理:

  • 多模組順序

  • 套件還原

  • 產出 .exe.dll

  • 一鍵整合測試與部署

javac?你要什麼功能,請自己搭配 shell script、jar 工具、依賴路徑。


😤 震驚事實 #2:你必須手動指定編譯順序

沒錯,Java 的原始設計要求你:

  • 先編 A,再編 B(如果 B 用到 A)

  • 自己組 -cp classpath

  • 自己分階段處理子模組 → jar → 主模組

這一切不是開玩笑,你不排順序,直接編譯會報錯!

對一個來自 .NET 背景的工程師來說,這根本是原始人操作法。


🧱 震驚事實 #3:Maven 的出現不是為了「更方便」,而是為了「救命」

原本我以為 Maven 像 NuGet + MSBuild + CLI 融合體,結果才發現——

是因為 Java 的建構流程根本無法單靠 javac 搞定,所以才需要 Maven。

Maven 本質上就是為了解決這些事:

  • 自動解析依賴

  • 決定各模組編譯順序

  • 幫你下好 javac 的每一個參數

  • 打包 + 測試 + 安裝 + 發佈


🧨 震驚事實 #4:Java 竟然沒有自帶 .exe 產出能力

C# 世界早就:

dotnet publish -c Release -r win-x64 --self-contained

→ 產出 .exe 可執行檔,甚至連 runtime 都一起包進去。

而 Java?

你得:

  • javac 編成 .class

  • jar 打包成 .jar

  • 再用 Launch4j、jpackage、JSmooth 等第三方工具 → .exe

還不一定好用,踩坑一堆。


📚 震驚事實 #5:沒有事件、沒有屬性、沒有 ref/out、沒有 GUI 標準

這些是 C# 世界的日常:

  • public string Name { get; set; }

  • event EventHandler SomethingHappened;

  • ref / out / params 任你用

  • GUI 有 WinForms / WPF / MAUI

Java 世界?抱歉:

  • getName() / setName() 自己寫

  • 事件要你自己寫 interface + handler 列表

  • 沒有 ref,要自己包個 holder class

  • GUI?Swing / JavaFX 慘不忍睹,還不如直接寫 Web 前端


🧠 最後總結:不是不能用,是你要有「願意受苦」的覺悟

Java 的哲學是:

我什麼都不幫你做決定,你要什麼就自己設計。

而 C# 是:

我盡可能幫你處理好,你專注在寫業務邏輯就行。

所以你會覺得 Java 的一切都很笨、很土、很麻煩 ——
但如果你懂得搭配 Maven/Gradle + 現代 IDE,其實也可以做得「不那麼慘」。


🔚 建議給 C# 轉 Java 的你:

  • 一開始直接用 Maven 或 Gradle,不要嘗試 javac 編整個專案

  • 使用 IntelliJ IDEA 或 Eclipse,不要硬寫 build.sh

  • 忍住吐槽,當作是重新認識編譯世界的一場歷險


未完待續

This article was last edited at