16. 降低學習?檻,消除冗餘代碼
1. JEP 477:隱式宣告類別和實例 main ?法 (3rd Prev)
2. JEP 476:模組匯?宣告 (Prev)
3. JEP 482:彈性建構式主體 (2nd Prev)
4. JEP 456:未命名變數和模式
5. JEP 455:模式、instanceof 與 switch 的基礎型別 (Prev)
6. JEP 467:Markdown ?件註解
7. JEP 458:啟動多檔案的原始碼程式
17. 開不了?的「安安你好」
// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
} 1. 需學習 public 與繼承和套件存取
2. 需學習 static 與靜態和實例成員
3. 寫 class {} 但?不到(類別)
4. 傳 String[] 但沒?到(陣列、命令列)
5. 已沒?氣解釋 System.out.println …
18. 實例 main ?法
// HelloWorld.java
public class HelloWorld {
void main() {
System.out.println("Hello, World!");
}
} 1. 主?法不需要 public
2. 主?法不需要 static
3. 不需要傳?String[]
19. 隱式宣告類別
// HelloWorld.java <- 檔名即為類別名稱
void main() {
System.out.println("Hello, World!");
}
1. 不需要 class {}
2. ?動建?隱式類別:
final class HelloWorld
extends Object
29. 早期在建構時想檢查參數
class Sub extends Super {
public Sub(int i) {
super(check(i)); // 只能透過靜態?法檢查
}
static int check(int i) {
if (i == 0) throw new RuntimeException();
return i;
}
}
30. 更彈性的建構式
class Sub extends Super {
private int x;
public Sub(int i) {
if (i == 0) throw new RuntimeException();
this.x = 1_000 / i; // 可以賦值
println("i=" + i);
// println("x=" + this.x); // 不可讀值
super(i); // 媽~~我在這!
}
}
1. 驗證傳?參數
2. 準備?∕?類別參數
3. 印出除錯訊息
4. 可賦值但不可讀取欄位
32. 未命名變數
try (var _ : acquire()) { // try-with-resources
for (var _ : items) i++; // enhanced for loop
for (int j = 0, _ = init(); j < i; j++) // for loop
items.get(j);
var m = items.stream()
.collect(toMap(n -> n, _ -> 1L)); //lambda
} catch (Exception _) { // exception
println("Exception occurs!");
}
33. 未命名模式 & 未命名模式變數
record Point(int x, int y) {}
record Circle(Point center, int radius) {}
record Rectangle(Point p1, Point p2) {}
if (o instanceof Circle(Point c, _)) { // int radius, 模式
println("Circle center: " + c);
} else if (o instanceof Rectangle(Point p1, _)) {//Point p2
println("Rectangle P1: " + p1);
} else if (o instanceof Point _) { // p, 模式變數
println("Point");
}
37. 基礎型別的模式匹配
return switch(number) {
case byte _ -> 1;
case int _ -> 2;
// Error: this case label is dominated
// by a preceding case label
case short _ -> 3; // 注意支配權
case long _ -> 4;
};
38. JEP 455:基礎型別的模式匹配
● 加強模式匹配,適?更廣的候選基礎型別
record Box(double d) 可以?
instanceof Box(int i) 去判定是否能轉型成 int
● 擴展 instanceof 與基礎型別的模式匹配
if (o instanceof int i) ...
● 擴展 switch 處理基礎型別的模式匹配
case byte b -> ...
39. ?件註釋選? HTML 的原因
● 1995 年選 HTML 是因為功能完整、標準,且當時
?常流?
● 現在已不流???寫 HTML
● 寫起來很繁瑣,閱讀不易
● 許多新的開發者已經不熟悉 HTML
61. 改善調?機制,提?存取安全
1. JEP 454:外部函式與記憶體 API
2. JEP 471:棄? sun.misc.Unsafe 中的記憶體存取?法
3. JEP 423:G1 區域釘選
4. JEP 474:ZGC 預設啟動分代模式
5. JEP 466:類別檔 API (2nd Prev)
62. JEP 454:外部函式與記憶體 API
● 安全地分配、存取和釋放外部記憶體
● 提供機制呼叫原?函式
● 防?不正確的記憶體存取或函式呼叫?崩潰
● 對原?記憶體和函式有低階存取並維持抽象層
● 易?、簡潔、模組化的 API 更容易維護和擴展
● 與原?程式碼和記憶體的互動具有?定的複雜度
● 不熟悉原?程式設計概念的?會有學習曲線
63. JEP 471:棄??舊記憶體存取?法
● 宣告移除 sun.misc.unsafe ?於外部記憶體存取
的不安全?法,它們會導致安全漏洞或程式崩潰
● FFM API 能有效且安全地存取外部記憶體,因此棄
?不安全的記憶體存取?法