聊聊 Java 新特性與設(shè)計(jì)模式
點(diǎn)擊上方“Java技術(shù)江湖”,選擇“設(shè)為星標(biāo)”
回復(fù)”666“獲取全網(wǎng)最熱的Java核心知識點(diǎn)整理

編譯器負(fù)責(zé)生成字節(jié)碼; JIT 編譯器負(fù)責(zé)優(yōu)化成本地代碼; JVM 解釋器負(fù)責(zé)輸出期望結(jié)果。 字節(jié)碼優(yōu)化技術(shù):內(nèi)聯(lián) inlining、消除 elimination、標(biāo)量化 scalarization。
下面是一個(gè)優(yōu)化后的結(jié)果示例:
static factory_method.Car produce(java.lang.String);descriptor: (Ljava/lang/String;)Lfactory_method/Car;flags: (0x0008) ACC_STATICCode:stack=7, locals=5, args_size=10: new #7 // class factory_method/FactoryMethodEvent3: dup...19: aload_320: invokevirtual #17 // Method java/lang/String.hashCode:()I23: lookupswitch { // 23135580: 483556498: 63default: 75}48: aload_349: ldc #23 // String fast51: invokevirtual #25 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
用 SOLID 思想看設(shè)計(jì)模式
概述 SOLID 原則以及與現(xiàn)在開發(fā)需要考慮的一些設(shè)計(jì)原則:
SOLID 原則:單一功能、開閉原則、里氏替換、接口隔離以及依賴反轉(zhuǎn);
不要重復(fù)自己,關(guān)注點(diǎn)分離,CAP 原則;
編程語言和技術(shù)不可知;
微服務(wù)架構(gòu)、分布式系統(tǒng)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)、數(shù)據(jù)流;
可擴(kuò)展性、可維護(hù)性與安全性。
Valhalla 項(xiàng)目:利用通用 API、基礎(chǔ)類型和值類型,提升機(jī)器學(xué)習(xí)和大數(shù)據(jù)應(yīng)用程序性能 隱藏類(JEP-371)、對值類型 class 進(jìn)行警告 (JEP-390) 等 Panama 項(xiàng)目:為 JVM 和非 Java API 提供橋梁,可以更容易地實(shí)現(xiàn) App 之間的 I/O 外部函數(shù)和內(nèi)存 API (JEP-424)、Vector API (JEP-426)等 Amber 項(xiàng)目:通過 Java 語言自身演進(jìn)提升生產(chǎn)率 局部變量類型推斷 (JEP-286)、switch 表達(dá)式改進(jìn) (JEP-361) TextBlocks (JEP-378)、Records (JEP-395), instanceof 的模式匹配 (JEP-394) 密封類 (JEP-409)、默認(rèn)支持 UTF-8 (JEP-400)、Record 模式 (JEP-405)等 Loom 項(xiàng)目: 易于使用,高吞吐量、輕量級并發(fā)和編程方法 虛擬線程 (JEP-425)、結(jié)構(gòu)化并發(fā) (JEP-428)等
備選方案:Factory 或 Builder。二者有何區(qū)別? 前者是封裝,后者是逐步構(gòu)建直到最后生產(chǎn) 其它區(qū)別包括,如何補(bǔ)充信息、實(shí)現(xiàn)可測試性等 其它選擇: 抽象工廠、原型模式、單例模式、 對象池延遲初始化、依賴注入
public class Thread implements Runnable { //JDK19(Preview)public sealed interface Builder permits Builder.OfPlatform,Builder.OfVirtual, ThreadBuilders.BaseThreadBuilder {..}}
JDK 中的工廠:使用 Java Collection framework,例如 List、Set 或者 Map。
static <E> List <E> of (E e1, E e2, E e3) {return ImmutableCollections.listFromTrustedArray(e1, e2, e3);}static <K, V> Map <K, V> of (K k1, V v) {return new ImmutableCollections.Map1 < > (k1, v1);}
下面是 CarFactory 示例及運(yùn)行效果:
record FastCar(String type) implements Car { ...sealed interface Factory permits CarFactory { ...final class CarFactory {static Vehicle produce(String type) {var result =switch (type) {case "fast" - > {...yield new FastCar(“super”);}case String swhen s.length() > 10 - > new SlowCar()...

如何結(jié)構(gòu)化思考
如何圍繞實(shí)例化對象組織代碼(指令)
備選方案:適配器或享元模式;
其它方案:組合模式、裝飾器模式、外觀模式(也稱門面模式)、過濾器模式、模塊模式、控制器模式、標(biāo)記型接口、代理模式、雙胞胎模式。
JDK 中的適配器:
public final class Spliterators { ...public static <T> Iterator <T> iterator(Spliterator <<?extends T> spliterator) {Objects.requireNonNull(spliterator);class Adapter implements Iterator <T> , Consumer <T> {...}}}public Collections {...public static <T> ArrayList <T> list(Enumeration <T> e) { ... }
JDK 中的友元:
Integer、Byte、Character 等包裝類,以及 valueOf(...) 方法使用到的緩存:
return IntegerCache.cache[i + (-IntegerCache.low)];下面是 Engine 密封接口示例及運(yùn)行效果:
var engine = counter++ % 2 == 0 ? new DieselEngine() : new ElectricEngine();var fastCar = new FastCar(engine);class FastCar {...FastCar(Engine engine) {...}public void drive() {...if (engine instanceof ElectricEngine ee) {ee.checkBatteries();}engine.run();...sealed interface Engine {void run();}

備選方案:責(zé)任鏈模式、命令模式、緩存; 其它方案:狀態(tài)模式、策略模式、解釋器模式、迭代器模式、中介者模式、 備忘錄模式、Null 對象、觀察者模式、管道、模板方法、訪問者模式等。
public class Logger {public void log(Level level, Supplier < String > msgSupplier)//overloaded method, Levels: OFF, SEVERE, WARNING ...
JDK 中的命令:
java.lang.Runnable, java.lang.CallableJDK 中的緩存:
java.util.Localeprivate static class Cache extends LocaleObjectCache < Object, Locale > {private static final Cache LOCALECACHE = new Cache();
并發(fā)相關(guān)
那么并行執(zhí)行的代碼該如何考慮呢?
根據(jù)問題的多線程性質(zhì)選擇適合的設(shè)計(jì)模式組合。
備選方案:線程池模式;
其它方案:主動(dòng)對象模式、異步方法調(diào)用、Balking 模式、雙重檢查鎖定、讀寫鎖、調(diào)度器等。
下圖中可以看到并發(fā)相關(guān) package 在 JDK 中的依賴關(guān)系(由 Java Mission Control 8.3 生成)
下面是一個(gè)使用虛擬線程的示例:
var threadPerTaskExecutor = Executors.newThreadPerTaskExecutor(threadFactory);var executor = Executors.newVirtualThreadPerTaskExecutor();threadPerTaskExecutor.execute(() - > {while (active.get()) {executor.submit(new ComputableTask(counter));}})
總結(jié)
設(shè)計(jì)模式和 JDK 新功能帶來了以下好處:
密封類、模式匹配讓代碼變得更清晰; switch 語法改進(jìn)、引入 Record 減少了冗余代碼; Amber 項(xiàng)目、Loom 項(xiàng)目增強(qiáng)了項(xiàng)目可維護(hù)性; 虛擬線程、結(jié)構(gòu)化并發(fā)、switch、局部變量類型推斷讓組合變得更簡單; 帶來更好的可觀測性、性能分析、調(diào)試功能。
Amber項(xiàng)目: https://openjdk.org/projects/amber/ Valhalla項(xiàng)目: https://openjdk.org/projects/valhalla/ Panama項(xiàng)目: https://openjdk.org/projects/panama/ JFR項(xiàng)目: https://github.com/openjdk/jmc OpenJDK: https://openjdk.org/ foojay.io: https://foojay.io/today/author/miro-wengner/ OpenValue博客: https://openvalue.blog/ Practical Design Patterns for Java Developers [PACKT]
轉(zhuǎn)自:Miroslav Wengner 與 Benedikt Neumayr,
鏈接:slideshare.net/miragemiko/new-java-features-simplified-design-patternslit3826
- EOF -

螞蟻金服一面:十道經(jīng)典面試題解析

Java 反射慢?它到底慢在哪?

13 款炫酷的 MySQL 可視化管理工具!好用到爆??!
關(guān)注公眾號【Java技術(shù)江湖】后回復(fù)“PDF”即可領(lǐng)取200+頁的《Java工程師面試指南》
強(qiáng)烈推薦,幾乎涵蓋所有Java工程師必知必會(huì)的知識點(diǎn),不管是復(fù)習(xí)還是面試,都很實(shí)用。

