主頁 > 軟體設計 > Java 每半年就會更新一次新特性,再不掌握就要落伍了:Java12 的新特性

Java 每半年就會更新一次新特性,再不掌握就要落伍了:Java12 的新特性

2022-01-18 08:53:52 軟體設計

Java12 的新特性

本文收錄在 《從小工到專家的 Java 進階之旅》 系列專欄中,

你好,我是看山,

從 2017 年開始,Java 版本更新策略從原來的每兩年一個新版本,改為每六個月一個新版本,以快速驗證新特性,推動 Java 的發展,從 《JVM Ecosystem Report 2021》 中可以看出,目前開發環境中有近半的環境使用 Java8,有近半的人轉移到了 Java11,隨著 Java17 的發布,相信比例會有所變化,

因此,準備出一個系列,配合示例講解,闡述各個版本的新特性,

概述

本文講解一下 Java12 的特性,作為第一個長期支持版 Java11 之后的第一個版本,增加的功能也不少,除了一些小幅度的 API 增強,增加了另一個試驗階段的垃圾收集器 Shenandoah、對 G1 做了優化、增加微基準套件等,

語法特性

Java12 提供了很多的語法特性,既有小而美的增強 API,又有特別方便的工具擴展,本節我們跟著代碼看看比較好玩的功能,

String 的增強方法:indent 和 transform

在 Java12 中,String 又增強了兩個方法,之所以說又,是因為在 Java11 中已經增加過小而美的方法,想要詳細了解的可以查看 Java11 新特性,

這次增加的方法是indent(縮進)和transform(轉換),

顧名思義,indent方法是對字串每行(使用\r\n分隔)資料縮進指定空白字符,引數是 int 型別,

如果引數大于 0,就縮進指定數量的空格;如果引數小于 0,就將左側的空字符洗掉指定數量,即右移,

我們看下原始碼:

public String indent(int n) {
    if (isEmpty()) {
        return "";
    }
    Stream<String> stream = lines();
    if (n > 0) {
        final String spaces = " ".repeat(n);
        stream = stream.map(s -> spaces + s);
    } else if (n == Integer.MIN_VALUE) {
        stream = stream.map(s -> s.stripLeading());
    } else if (n < 0) {
        stream = stream.map(s -> s.substring(Math.min(-n, s.indexOfNonWhitespace())));
    }
    return stream.collect(Collectors.joining("\n", "", "\n"));
}

這里會使用到 Java11 增加的linesrepeatstripLeading等方法,indent最后會將多行資料通過Collectors.joining("\n", "", "\n")方法拼接,結果會有兩點需要注意:

  • \r會被替換成\n
  • 如果原字串是多行資料,最后一行的結尾沒有\n,最后會補上一個\n,即多了一個空行,

我們看下測驗代碼:

@Test
void testIndent() {
    final String text = "\t\t\t 你好,我是看山,\n \u0020\u2005Java12 的 新特性,\r 歡迎三連+關注喲";
    assertEquals("    \t\t\t 你好,我是看山,\n     \u0020\u2005Java12 的 新特性,\n    歡迎三連+關注喲、n", text.indent(4));
    assertEquals("\t 你好,我是看山,\n\u2005Java12 的 新特性,\n 歡迎三連+關注喲、n", text.indent(-2));

    final String text2 = "山水有相逢";
    assertEquals("山水有相逢", text2);
}

我們再來看看transform方法,原始碼一目了然:

public <R> R transform(Function<? super String, ? extends R> f) {
    return f.apply(this);
}

通過傳入的Function對當前字串進行轉換,轉換結果由Function決定,比如,我們要對字串反轉:

@Test
void testTransform() {
    final String text = "看山是山";
    final String reverseText = text.transform(s -> new StringBuilder(s).reverse().toString());
    assertEquals("山是山看", reverseText);
}

其實這個方法在 Java8 中提供的Optional實作類似的功能(完整的 Optional 功能可以查看 Optional 的 6 種操作):

@Test
void testTransform() {
    final String text = "看山是山";
    final String reverseText2 = Optional.of(text)
            .map(s -> new StringBuilder(s).reverse().toString())
            .orElse("");
    assertEquals("山是山看", reverseText2);
}

Files 的增強方法:mismatch

在 Java12 中,Files增加了mismatch方法,用于對比兩個檔案中的不相同字符的位置,如果內容相同,回傳-1L,是long型別的,

我們來簡單看下怎么用:

@Test
void testMismatch() throws IOException {
    final Path pathA = Files.createFile(Paths.get("a.txt"));
    final Path pathB = Files.createFile(Paths.get("b.txt"));

    // 寫入相同內容
    Files.write(pathA, "看山".getBytes(), StandardOpenOption.WRITE);
    Files.write(pathB, "看山".getBytes(), StandardOpenOption.WRITE);

    final long mismatch1 = Files.mismatch(pathA, pathB);
    Assertions.assertEquals(-1L, mismatch1);

    // 追加不同內容
    Files.write(pathA, "是山".getBytes(), StandardOpenOption.APPEND);
    Files.write(pathB, "不是山".getBytes(), StandardOpenOption.APPEND);

    final long mismatch2 = Files.mismatch(pathA, pathB);
    Assertions.assertEquals(6L, mismatch2);

    Files.deleteIfExists(pathA);
    Files.deleteIfExists(pathB);
}

我們可以看到,當第一次在兩個檔案中寫入相同內容,執行mismatch方法回傳的是-1L,當第二次追加進去不同的內容后,回傳的是6L,之所以是 6,是因為測驗代碼中使用的字符集是UTF-8,大部分漢子是占用 3 個字符,前兩個字相同,從第三個字開始不同,下標從 0 開始,所以開始位置是 6,

Collectors 的增強方法:teeing

我們看下teeing的定義:

public static <T, R1, R2, R> Collector<T, ?, R> teeing(
    Collector<? super T, ?, R1> downstream1,
    Collector<? super T, ?, R2> downstream2,
    BiFunction<? super R1, ? super R2, R> merger
)

這個方法有三個引數,前兩個是Collector物件,用于對輸入資料進行預處理,第三個引數是BiFunction,用于將前兩個處理后的結果作為引數傳入BiFunction中,運算得到結果,

我們來看下例子:

@Test
void testTeeing() {
    var result = Stream.of("Sunday", "Monday", "Tuesday", "Wednesday")
            .collect(Collectors.teeing(
                    Collectors.filtering(n -> n.contains("u"), Collectors.toList()),
                    Collectors.filtering(n -> n.contains("n"), Collectors.toList()),
                    (list1, list2) -> List.of(list1, list2)
            ));

    assertEquals(2, result.size());
    assertTrue(isEqualCollection(List.of("Sunday", "Tuesday"), result.get(0)));
    assertTrue(isEqualCollection(List.of("Sunday", "Monday", "Wednesday"), result.get(1)));
}

我們對輸入的幾個字串進行過濾,然后將過濾結果組成一個新的佇列,

新工具:CompactNumberFormat

這個工具比較好玩,可以對數字進行按需格式化,提供了public static NumberFormat getCompactNumberInstance(Locale locale, NumberFormat.Style formatStyle)方法用于初始化:

  • 第一個引數是指定區域,不同區域展示的結果不同,比如中國展示漢字、美國展示英文;
  • 第二個引數是指定展示結果的模式,分為SHORTLONG,不過對于中文展示,似乎沒啥區別,

我們一起看下例子:

@Test
void testFormat() {
    final NumberFormat zhShort = NumberFormat.getCompactNumberInstance(Locale.CHINA, Style.SHORT);
    assertEquals("1 萬", zhShort.format(10_000));
    assertEquals("1 兆", zhShort.format(1L << 40));

    final NumberFormat zhLong = NumberFormat.getCompactNumberInstance(Locale.CHINA, Style.LONG);
    assertEquals("1 萬", zhLong.format(10_000));
    assertEquals("1 兆", zhLong.format(1L << 40));

    final NumberFormat usShort = NumberFormat.getCompactNumberInstance(Locale.US, Style.SHORT);
    usShort.setMaximumFractionDigits(2);
    assertEquals("10K", usShort.format(10_000));
    assertEquals("1.1T", usShort.format(1L << 40));

    final NumberFormat usLong = NumberFormat.getCompactNumberInstance(Locale.US, Style.LONG);
    usLong.setMaximumFractionDigits(2);
    assertEquals("10 thousand", usLong.format(10_000));
    assertEquals("1.1 trillion", usLong.format(1L << 40));
}

我們也可以繼續使用NumberFormat中的方法定義,比如示例中保留小數點后 2 位,

Shenandoah:一個低停頓垃圾收集器

Java12 引入了一個實驗階段的垃圾收集器:Shenandoah,作為一個低停頓的垃圾收集器,

Shenandoah 垃圾收集器是 RedHat 在 2014 年宣布進行的垃圾收集器研究專案,其作業原理是通過與 Java 應用執行執行緒同時運行來降低停頓時間,簡單的說就是,Shenandoah 作業時與應用程式執行緒并發,通過交換 CPU 并發周期和空間以改善停頓時間,使得垃圾回收器執行執行緒能夠在 Java 執行緒運行時進行堆壓縮,并且標記和整理能夠同時進行,因此避免了在大多數 JVM 垃圾收集器中所遇到的問題,

Shenandoah GC

Shenandoah 垃圾回收器的暫停時間與堆大小無關,這意味著無論將堆設定為 200MB 還是 200GB,都將擁有一致的系統暫停時間,不過實際使用性能將取決于實際作業堆的大小和作業負載,

Java12 中 Shenandoah 處于實驗階段,想要使用需要編譯時添加--with-jvm-features=shenandoahgc,然后啟動時使用-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC以開啟,

后續會補充 Java 中各種垃圾收集器的文章,其中會有介紹 Shenandoah 的,敬請關注公眾號「看山的小屋」,如果想要提前了解,歡迎訪問https://wiki.openjdk.java.net/display/shenandoah,

增加一套基準測驗套件

Java12 中添加一套基準測驗套件,該基準測驗套件基于 JMH(Java Microbenchmark Harness),使開發人員可以輕松運行現有的基準測驗并創建新的基準測驗,其目標是提供一個穩定且優化的基準,

在這套基準測驗套件中包括將近 100 個基準測驗的初始集合,并且能夠輕松添加新基準、更新基準測驗和提高查找已有基準測驗的便利性,

微基準套件與 JDK 源代碼位于同一個目錄中,并且在構建后將生成單個 Jar 檔案,它是一個單獨的專案,在支持構建期間不會執行,以方便開發人員和其他對構建微基準套件不感興趣的人在構建時花費比較少的構建時間,

Switch 運算式擴展(預覽版)

Switch 陳述句出現的姿勢是條件判斷、流程控制組件,與現在很流行的新語言對比,其寫法顯得非常笨拙,所以 Java 推出了 Switch 運算式語法,可以讓我們寫出更加簡化的代碼,這個擴展在 Java12 中作為預覽版首次引入,需要在編譯時增加-enable-preview開啟,在 Java14 中正式提供,功能編號是 JEP 361,

比如,我們通過 switch 語法簡單計算作業日、休息日,在 Java12 之前需要這樣寫:

@Test
void testSwitch() {
    final DayOfWeek day = DayOfWeek.from(LocalDate.now());
    String typeOfDay = "";
    switch (day) {
        case MONDAY:
        case TUESDAY:
        case WEDNESDAY:
        case THURSDAY:
        case FRIDAY:
            typeOfDay = "Working Day";
            break;
        case SATURDAY:
        case SUNDAY:
            typeOfDay = "Rest Day";
            break;
    }

    Assertions.assertFalse(typeOfDay.isEmpty());
}

在 Java12 中的 Switch 運算式中,我們可以直接簡化:

@Test
void testSwitchExpression() {
    final DayOfWeek day = DayOfWeek.SATURDAY;
    final String typeOfDay = switch (day) {
        case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Working Day";
        case SATURDAY, SUNDAY -> "Day Off";
    };

    Assertions.assertEquals("Day Off", typeOfDay);
}

是不是很清爽,文末提供的原始碼中,pom.xml定義的maven.compiler版本寫的是14,這是因為 Switch 運算式是 Java14 正式提供,我沒有重新編譯 Java,所以只能指定 Java14 來實作這個功能代碼的演示,

引入 JVM 常量 API

Java12 中引入 JVM 常量 API,用來更容易地對關鍵類檔案和運行時構件的描述資訊進行建模,特別是對那些從常量池加載的常量,這是一項非常技術性的變化,能夠以更簡單、標準的方式處理可加載常量,

具體來說就是java.base模塊新增了java.lang.constant包,引入了ConstantDesc介面以及Constable介面,ConstantDesc的子介面包括:

  • ClassDesc:Class 的可加載常量標稱描述符;
  • MethodTypeDesc:方法型別常量標稱描述符;
  • MethodHandleDesc:方法句柄常量標稱描述符;
  • DynamicConstantDesc:動態常量標稱描述符,

繼續挖坑,這部分內容會在進階篇再詳細介紹,敬請關注公眾號「看山的小屋」,

改進 AArch64 實作

Java12 中將只保留一套 AArch64 實作,之前版本中,有兩個關于 aarch64 的實作,分別是ope/src/hotspot/cpu/arm以及open/src/hotspot/cpu/aarch64,它們的實作重復了,為了集中精力更好地實作 aarch64,洗掉了open/src/hotspot/cpu/arm中與 arm64(64-bit Arm platform)實作相關的代碼,只保留 32 位 ARM 埠和 64 位 aarch64 的埠,

這樣做,可以讓開發人員將目標集中在剩下的這個 64 位 ARM 實作上,消除維護兩套埠所需的重復作業,

目標聚焦,力量集中,

默認使用類資料共享(CDS)存檔

在 Java10 的新特性 中我們介紹過類資料共享(CDS,Class Data Sharing),其作用是通過構建時生成默認類串列,在運行時使用記憶體映射,減少 Java 的啟動時間和減少動態記憶體占用量,也能在多個 Java 虛擬機之間共享相同的歸檔檔案,減少運行時的資源占用,

在 Java12 之前,想要使用需要三步走手動開啟,到了 Java12,將默認開啟 CDS 功能,想要關閉,需要使用引數-Xshare:off

改善 G1 垃圾收集器

能夠中止收集

G1 垃圾收集器可以在大記憶體多處理器的作業場景中提升回收效率,能夠滿足用戶預期降低 STW 停頓時間,

其內部是采用一個高級分析引擎來選擇在收集期間要處理的作業量,此選擇程序的結果是一組稱為 GC 回收集(collection set,CSet)的區域,一旦收集器確定了 GC 回收集 并且 GC 回收、整理作業已經開始,則 G1 收集器必須完成收集集合集的所有區域中的所有活動物件之后才能停止;但是如果收集器選擇過大的 GC 回收集,可能會導致 G1 回收器停頓時間超過預期時間,

在 Java12 中,GC 回收集拆分為必需和可選兩部分,使 G1 垃圾回收器能中止垃圾回收程序,其中必需處理的部分包括 G1 垃圾收集器不能遞增處理的 GC 回收集的部分,同時也可以包含老年代以提高處理效率,在 G1 垃圾回收器完成收集需要必需回收的部分之后,G1 垃圾回收器可以根據剩余時間決定是否停止收集,

向作業系統自動回傳未用堆記憶體

在 Java11 中,G1 僅在進行 Full GC 或并發處理周期時才能向作業系統返還堆記憶體,但是這兩種場景都是 G1 極力避免的,所以如果我們使用 G1 收集器,基本上很難返還 Java 堆記憶體,這樣對于那種周期性執行大量占用記憶體的應用,會造成比較多的記憶體浪費,

Java12 中,G1 垃圾收集器將在應用程式不活動期間定期生成或持續回圈檢查整體 Java 堆使用情況,以便 G1 垃圾收集器能夠更及時的將 Java 堆中不使用記憶體部分返還給作業系統,對于長時間處于空閑狀態的應用程式,此項改進將使 JVM 的記憶體利用率更加高效,

文末總結

本文介紹了 Java12 新增的特性,完整的特性清單可以從https://openjdk.java.net/projects/jdk/12/查看,后續內容會發布在 從小工到專家的 Java 進階之旅 系列專欄中,

青山不改,綠水長流,我們下次見,

推薦閱讀

  • 一文掌握 Java8 Stream 中 Collectors 的 24 個操作
  • 一文掌握 Java8 的 Optional 的 6 種操作
  • 使用 Lambda 運算式實作超強的排序功能
  • Java8 的時間庫(1):介紹 Java8 中的時間類及常用 API
  • Java8 的時間庫(2):Date 與 LocalDate 或 LocalDateTime 互相轉換
  • Java8 的時間庫(3):開始使用 Java8 中的時間類
  • Java8 的時間庫(4):檢查日期字串是否合法
  • Java8 的新特性
  • Java9 的新特性
  • Java10 的新特性
  • Java11 中基于嵌套關系的訪問控制優化
  • Java11 的新特性
  • 從小工到專家的 Java 進階之旅

你好,我是看山,游于碼界,戲享人生,如果文章對您有幫助,請點贊、收藏、關注,我還整理了一些精品學習資料,關注公眾號「看山的小屋」,回復“資料”即可獲得,

個人主頁:https://www.howardliu.cn
個人博文:Java 每半年就會更新一次新特性,再不掌握就要落伍了:Java12 的新特性
CSDN 主頁:https://kanshan.blog.csdn.net/
CSDN 博文:Java 每半年就會更新一次新特性,再不掌握就要落伍了:Java12 的新特性

👇🏻歡迎關注我的公眾號「看山的小屋」,領取精選資料👇🏻

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/413957.html

標籤:其他

上一篇:動態規劃——StickersToSpellWord

下一篇:演算法基礎系列第四章——數論之質數與約數

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more