<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          聊聊 Java 新特性與設(shè)計(jì)模式

          共 5902字,需瀏覽 12分鐘

           ·

          2023-01-06 18:41

          點(diǎn)擊上方“Java技術(shù)江湖”,選擇“設(shè)為星標(biāo)

          回復(fù)”666“獲取全網(wǎng)最熱的Java核心知識點(diǎn)整理


          Java 平臺與 OpenJDK

          讓我們從 Java 虛擬機(jī)開始。

          • 編譯器負(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_STATIC  Code:    stack=7, locals=5, args_size=1      0: new #7  // class factory_method/FactoryMethodEvent      3: dup      ...      19: aload_3      20: invokevirtual #17 // Method java/lang/String.hashCode:()I      23: lookupswitch { // 2        313558048        355649863        default75      }      48: aload_3      49: ldc #23  // String fast      51: 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ù)性與安全性。


          設(shè)計(jì)模式分創(chuàng)建型、結(jié)構(gòu)型、行為型,其中行為型設(shè)計(jì)模式需要考慮服務(wù)、運(yùn)行時(shí)的并發(fā)。

          一些重要項(xiàng)目

          • 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)等

          簡化創(chuàng)建對象

          • 備選方案:Factory 或 Builder。二者有何區(qū)別?
            • 前者是封裝,后者是逐步構(gòu)建直到最后生產(chǎn)
            • 其它區(qū)別包括,如何補(bǔ)充信息、實(shí)現(xiàn)可測試性等
          • 其它選擇:
            • 抽象工廠、原型模式、單例模式、 對象池延遲初始化、依賴注入

          JDK 中使用 Builder:使用 StringBuilder 或者像下面這樣:


          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 s                when 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();}


          運(yùn)行時(shí)設(shè)置行為

          運(yùn)行時(shí)如何維護(hù)對象之間的信息傳遞?

          由 JVM 和代碼庫提供靈活性和可維護(hù)性。

          • 備選方案:責(zé)任鏈模式、命令模式、緩存;
          • 其它方案狀態(tài)模式、策略模式、解釋器模式、迭代器模式、中介者模式、 備忘錄模式、Null 對象、觀察者模式、管道、模板方法、訪問者模式等。

          JDK 中的責(zé)任鏈:


          public class Logger {    public void log(Level level, Supplier < String > msgSupplier)    //overloaded method, Levels: OFF, SEVERE, WARNING ...


          JDK 中的命令:


          java.lang.Runnablejava.lang.Callable


          JDK 中的緩存:


          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í)用。



          瀏覽 59
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲成人无码视频 | 狼友视频主页 | 18禁片欧 | 性久久久久久久 | 亚洲欧洲在线观看高清 |