一、 抽象類別、介面架構本質差異
決定抽象類別還是介面,不是看能不能寫實作代碼,而是看是否需要持有維護物件的內部狀態。
如果你要透過建構子來寫相依性、在父類別裡管理具體屬性變數的生命週期就選抽象類別;如果你只是要定義一套標準,有可能需要讓完全不相干的類別都能套用就選介面。
二、Java8/9的演進
Lambda表達式與方法參考:
改變傳統匿名內部類別過度冗長的問題,將程式碼區塊作為First-class Citizen傳遞。
函數式介面(Functional Interface):
配合Lambda 定義了@FunctionalInterface,只允許單一抽象方法。
官方內建四大核心介面:條件判斷Predicate、消費操作Consumer、型別轉換Function、惰性產值Supplier。
Stream API(管線化資料流):
將集合資料操作從指令式for迴圈升級為「管線化串接」。
支援惰性求值與終端操作,並內建Parallel Stream降低並行計算門檻。
介面演進 default與static方法:
加入default方法提供預設的實作,解決集合框架升級時向後相容破壞的問題;static方法則讓介面具備定義工廠方法的命名空間。
Optional 容器型別:
顯式表達「值可能存在或為空」,從架構層面規範API回傳值,避免呼叫引發未知的NullPointerException。
全新Date&Time:
徹底淘汰線程不安全、月份由0開始且容易出錯的Date與Calendar。
改用不可變且線程安全的全新類別:LocalDate、LocalTime、Instant與DateTimeFormatter。
JVM底層移除永久代(PermGen),改用元空間(Metaspace):
類別元資訊的儲存不再受限於固定大小的JVM堆積記憶體,改由作業系統的本地記憶體動態調度,大幅降低java.lang.OutOfMemoryError:PermGen space的風險。
2.Java 9雖然新語法不多,但對JVM底層與JDK自身結構進行了重塑。
JPMS平台模組系統:
透過module-info.java引入模組化機制,宣告requires與 exports。
達成強封裝(Strong Encapsulation),外部不再能靠Reflection強行存取未開放的internal套件。
支援按需剪裁JDK,開發者可用jlink工具打包出僅數十MB、只包含專案必要模組的自訂微型執行環境。
介面支援private方法:
補完Java 8的遺憾。當介面內多個default方法需要共用一段邏輯時,能抽取為private方法封裝在介面內部,不對外洩漏實作細節。
Compact Strings:
將String底層存放字元的結構由 char[](每個字元固定佔 2 Bytes)改為byte[]加上編碼旗標coder。
集合工廠方法:
原生支援快速建立不可變集合:List.of()、Set.of()、Map.of()。
淘汰過去Arrays.asList()實體為可變陣列的陷阱,以及Collections.unmodifiableList()冗長的包裝寫法。
JShell(互動式終端機):
首次具備像Python一樣的互動式命令列環境,不需先建專案、宣告類別與寫main方法,就能即時驗證語法與API。
Process API增強:
ProcessHandle介面提供了對作業系統行程的直接控制,能精準獲取PID、父子行程樹、啟動時間與資源消耗,不再依賴呼叫系統原生指令。
全新HTTP/2 Client:
為日後Java 11正式替換老舊HttpURLConnection奠定基礎,原生支援HTTP/2、WebSocket與非同步響應流。