我從 C# 轉寫 Java,結果三觀全碎:這些 Java 的編譯設計真的離譜
Copyright Notice: This article is an original work licensed under the CC 4.0 BY-NC-ND license.
If you wish to repost this article, please include the original source link and this copyright notice.
Source link: https://v2know.com/article/1260
前言:一個 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