Java 23 新特性解析與代碼示例

Java 23 新特性解析與代碼示例

文章目錄

  • Java 23 新特性解析與代碼示例
    • 1. 引言
    • 2. 正式特性
      • 2.1. Markdown文檔注釋 (JEP 467)
      • 2.2. 廢棄sun.misc.Unsafe的內存訪問方法以移除 (JEP 471)
      • 2.3. ZGC:默認啟用代際模式 (JEP 474)
    • 3. 預覽特性
      • 3.1. 原始類型在模式、instanceof和switch中的支持 (JEP 455)
      • 3.2. 類文件API (第二次預覽) (JEP 466)
      • 3.3. 流收集器 (第二次預覽) (JEP 473)
      • 3.4. 模塊導入聲明 (JEP 476)
      • 3.5. 隱式聲明類和實例主方法 (第三次預覽) (JEP 477)
      • 3.6. 結構化并發 (第三次預覽) (JEP 480)
      • 3.7. 作用域值 (第三次預覽) (JEP 481)
      • 3.8. 靈活的構造器體 (第二次預覽) (JEP 482)
    • 4. 孵化特性
      • 4.1. 向量API (第八次孵化) (JEP 469)
    • 5. 結語

1. 引言

Java 23(JDK 23)于2024年9月17日正式發布,作為非長期支持(non-LTS)版本,它為開發者提供了探索最新特性的機會,同時為即將推出的長期支持版本(如Java 25,預計2025年9月發布)奠定基礎。Java 23包含12個JDK增強提案(JEPs),分為3個正式特性、8個預覽特性和1個孵化特性。這些特性涵蓋了從文檔編寫到并發編程、性能優化的多個方面,旨在提升開發者生產力、代碼可讀性和程序性能。

本文將深入解析每個JEP,提供詳細的背景說明、實際用途和完整的代碼示例。對于優化現有功能的特性,我們將通過對比代碼展示改進之處。預覽特性需要使用--enable-preview標志啟用,建議在非生產環境中測試并向Java社區提供反饋,以幫助完善這些功能。無論您是經驗豐富的Java開發者還是初學者,本文都將為您提供實用的“干貨”,讓您能夠快速上手Java 23的新特性。

在這里插入圖片描述

2. 正式特性

2.1. Markdown文檔注釋 (JEP 467)

背景與用途

Java 23引入了Markdown文檔注釋(JEP 467),允許開發者使用Markdown語法編寫Javadoc注釋,替代傳統的HTML和Javadoc標簽混合格式。Markdown是一種簡單易讀的標記語言,廣泛用于開源項目和文檔編寫。通過支持Markdown,Java 23簡化了文檔的編寫和維護,提高了代碼注釋的可讀性。

傳統Javadoc與Markdown對比

在Java 22及之前,Javadoc注釋通常使用HTML和Javadoc標簽,例如:

/*** <p>計算一個數的階乘。</p>* <ul>*   <li>輸入必須為非負數。</li>*   <li>返回結果為long類型。</li>* </ul>* @param n 輸入的整數* @return n的階乘*/
public static long factorial(int n) {// ...
}

使用Markdown后,同樣的注釋可以簡化為:

/*** 計算一個數的階乘。** - 輸入必須為非負數。* - 返回結果為long類型。* @param n 輸入的整數* @return n的階乘*/
public static long factorial(int n) {// ...
}

Markdown語法更直觀,減少了HTML標簽的復雜性。

使用方法

Markdown注釋使用與傳統Javadoc相同的/** */格式,內容遵循CommonMark標準,支持標題、列表、代碼塊、鏈接等。例如:

/*** # 階乘計算器* ## 功能描述* 計算給定整數的階乘。** **輸入要求**:非負整數。* **輸出**:`long`類型的階乘結果。** 示例代碼:* ```java* long result = factorial(5); // 返回120* ```
*
* 參考:[Java 23文檔](https://docs.oracle.com/en/java/javase/23/javadoc/using-markdown-documentation-comments.html)
* @param n 輸入的整數
* @return n的階乘*/public static long factorial(int n) {if (n < 0) throw new IllegalArgumentException("輸入必須為非負數");if (n == 0) return 1;return n * factorial(n - 1);}

優勢

  • 可讀性:Markdown語法簡潔,易于閱讀和編寫。
  • 一致性:與開源社區常用的Markdown格式保持一致。
  • 工具支持:IntelliJ IDEA等IDE支持Markdown預覽,生成HTML文檔時效果一致。

注意事項

Markdown注釋支持Javadoc標簽(如@param@return),但在代碼塊中這些標簽不會被解析。開發者可以混合使用Markdown和傳統Javadoc標簽,但需注意格式一致性。

參考:JEP 467

2.2. 廢棄sun.misc.Unsafe的內存訪問方法以移除 (JEP 471)

背景與用途

sun.misc.Unsafe是一個非標準API,提供了低級內存操作功能,但因其不安全性和缺乏官方支持,長期被視為問題來源。JEP 471將sun.misc.Unsafe的內存訪問方法標記為廢棄并計劃在未來版本移除,鼓勵開發者使用標準API,如VarHandleForeign Function & Memory API

傳統使用與替代方案

在Java 22及之前,開發者可能使用sun.misc.Unsafe進行內存操作,例如:

import sun.misc.Unsafe;
import java.lang.reflect.Field;public class UnsafeExample {public static void main(String[] args) throws Exception {Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");unsafeField.setAccessible(true);Unsafe unsafe = (Unsafe) unsafeField.get(null);long address = unsafe.allocateMemory(8);unsafe.putLong(address, 12345L);System.out.println("Value: " + unsafe.getLong(address));unsafe.freeMemory(address);}
}

在Java 23中,上述代碼會觸發廢棄警告。推薦使用VarHandle替代:

import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;public class VarHandleExample {private long value;public static void main(String[] args) throws Exception {VarHandleExample obj = new VarHandleExample();VarHandle handle = MethodHandles.lookup().findVarHandle(VarHandleExample.class, "value", long.class);handle.set(obj, 12345L);System.out.println("Value: " + handle.get(obj));}
}

優勢

  • 安全性VarHandle提供類型安全的內存訪問。
  • 標準支持:作為Java標準API的一部分,VarHandle有官方支持和文檔。
  • 未來兼容性:避免因sun.misc.Unsafe移除導致的代碼失效。

注意事項

開發者需盡快遷移現有代碼到標準API,以避免未來版本的兼容性問題。Foreign Function & Memory API(JEP 469)也為內存操作提供了更現代的替代方案。

參考:JEP 471

2.3. ZGC:默認啟用代際模式 (JEP 474)

背景與用途

Z垃圾回收器(ZGC)是一個低延遲、可擴展的垃圾回收器,Java 23通過JEP 474將ZGC的代際模式設為默認。此模式通過區分年輕代和老年代優化內存管理,提高吞吐量和降低延遲。

傳統ZGC與代際模式的對比

在Java 22及之前,ZGC默認使用非代際模式,需手動啟用代際模式:

java -XX:+UseZGC -XX:+ZGenerational MyApp

在Java 23中,代際模式成為默認,無需額外標志:

java -XX:+UseZGC MyApp

使用示例

以下是一個簡單的應用程序,展示ZGC的性能優勢:

public class ZGCTest {public static void main(String[] args) {for (int i = 0; i < 1000000; i++) {new Object(); // 快速創建對象,觸發垃圾回收}System.out.println("完成對象分配");}
}

運行時使用ZGC:

java -XX:+UseZGC ZGCTest

優勢

  • 性能提升:代際模式通過分離年輕代和老年代,減少全堆掃描,提高回收效率。
  • 低延遲:ZGC的暫停時間通常在毫秒級,適合高性能應用。
  • 簡化配置:默認啟用代際模式,減少手動配置需求。

注意事項

代際模式可能增加內存占用,開發者需根據應用場景調整JVM參數。非代際模式仍可通過-XX:-ZGenerational啟用,但不推薦。

參考:JEP 474

3. 預覽特性

3.1. 原始類型在模式、instanceof和switch中的支持 (JEP 455)

背景與用途

JEP 455(預覽特性)擴展了模式匹配功能,允許在instanceofswitch語句中使用原始類型,增強了代碼的表達力和安全性。此特性消除了對原始類型進行裝箱/拆箱的需求,并確保類型轉換的安全性。

傳統方式與新特性的對比

在Java 22及之前,instanceof僅支持引用類型,原始類型需手動檢查:

Object obj = 42;
if (obj instanceof Integer) {Integer i = (Integer) obj;System.out.println("整數: " + i);
}

在Java 23中,可以直接使用原始類型模式:

Object obj = 42;
if (obj instanceof int i) {System.out.println("整數: " + i);
}

使用示例

instanceof示例

public class PrimitivePatternExample {public static void main(String[] args) {Object obj = 100;if (obj instanceof int i && i >= 0 && i <= 127) {System.out.println("可以安全轉換為byte: " + (byte) i);} else {System.out.println("無法安全轉換為byte");}}
}

switch示例

public class PrimitiveSwitchExample {public static void main(String[] args) {Object obj = 3.14;String result = switch (obj) {case int i -> "整數: " + i;case double d -> "雙精度浮點數: " + d;default -> "未知類型";};System.out.println(result);}
}

啟用方法

編譯和運行時需啟用預覽特性:

javac --enable-preview --release 23 PrimitivePatternExample.java
java --enable-preview PrimitivePatternExample

優勢

  • 安全性:避免不安全的類型轉換,減少數據丟失風險。
  • 簡潔性:減少裝箱/拆箱操作,提高代碼可讀性。
  • 一致性:使原始類型和引用類型的模式匹配行為一致。

參考:JEP 455

3.2. 類文件API (第二次預覽) (JEP 466)

背景與用途

JEP 466提供了一個標準API,用于解析、生成和轉換Java類文件,替代第三方庫(如ASM)。此API適用于編譯器、字節碼生成器和分析工具。

使用示例

以下示例展示如何使用類文件API解析類文件:

import jdk.incubator.classfile.*;public class ClassFileExample {public static void main(String[] args) throws Exception {ClassModel classModel = ClassFile.of().parse("MyClass.class".getBytes());for (MethodModel method : classModel.methods()) {System.out.println("方法: " + method.methodName().stringValue());}}
}

啟用方法

作為孵化特性,需啟用預覽:

javac --enable-preview --release 23 ClassFileExample.java
java --enable-preview ClassFileExample

優勢

  • 標準化:提供官方支持的類文件操作API。
  • 靈活性:支持字節碼生成和轉換,適合工具開發。
  • 未來性:替代不穩定的內部API和第三方庫。

參考:JEP 466

3.3. 流收集器 (第二次預覽) (JEP 473)

背景與用途

JEP 473引入了流收集器(Stream Gatherers),允許開發者定義自定義的流中間操作,增強Stream API的靈活性。

使用示例

以下是一個自定義收集器,將流分組為固定大小的子列表:

import java.util.stream.*;public class StreamGatherersExample {public static void main(String[] args) {Stream.of(1, 2, 3, 4, 5).gather(Gatherers.windowFixed(2)).forEach(System.out::println);}
}

輸出:

[1, 2]
[3, 4]
[5]

啟用方法

編譯和運行時需啟用預覽特性:

javac --enable-preview --release 23 StreamGatherersExample.java
java --enable-preview StreamGatherersExample

優勢

  • 靈活性:支持復雜的流操作。
  • 可讀性:使數據處理邏輯更清晰。
  • 可擴展性:允許開發者自定義流處理邏輯。

參考:JEP 473

3.4. 模塊導入聲明 (JEP 476)

背景與用途

JEP 476允許通過單一導入語句導入模塊導出的所有包,簡化模塊化應用的代碼。

傳統方式與新特性的對比

在Java 22及之前,需逐一導入包:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

在Java 23中,可以使用模塊導入:

import module java.sql;

使用示例

import module java.sql;public class ModuleImportExample {public static void main(String[] args) throws SQLException {Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");System.out.println("數據庫連接成功");}
}

啟用方法

編譯和運行時需啟用預覽特性:

javac --enable-preview --release 23 ModuleImportExample.java
java --enable-preview ModuleImportExample

優勢

  • 簡潔性:減少導入語句的冗余。
  • 可維護性:簡化模塊化項目的代碼管理。
  • 清晰性:明確模塊依賴關系。

參考:JEP 476

3.5. 隱式聲明類和實例主方法 (第三次預覽) (JEP 477)

背景與用途

JEP 477旨在降低Java初學者的學習曲線,允許編寫簡化的類和主方法,省略繁瑣的類聲明。

傳統方式與新特性的對比

傳統Java程序:

public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}

在Java 23中,可以簡化為:

void main() {println("Hello, World!");
}

使用示例

void main() {List<String> names = List.of("Alice", "Bob");for (String name : names) {println("Hello, " + name + "!");}
}

啟用方法

編譯和運行時需啟用預覽特性:

javac --enable-preview --release 23 HelloWorld.java
java --enable-preview HelloWorld

優勢

  • 初學者友好:簡化程序結構,降低學習門檻。
  • 簡潔性:減少樣板代碼。
  • 教學用途:適合教學和快速原型開發。

參考:JEP 477

3.6. 結構化并發 (第三次預覽) (JEP 480)

背景與用途

JEP 480引入了結構化并發API,將相關任務視為一個工作單元,簡化多線程編程,提高錯誤處理和任務取消的可靠性。

使用示例

以下示例展示如何并行執行任務并處理結果:

import java.util.concurrent.*;public class StructuredConcurrencyExample {public static void main(String[] args) throws Exception {try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {Future<String> task1 = scope.fork(() -> "任務1結果");Future<String> task2 = scope.fork(() -> "任務2結果");scope.join().throwIfFailed();System.out.println(task1.resultNow() + ", " + task2.resultNow());}}
}

啟用方法

編譯和運行時需啟用預覽特性:

javac --enable-preview --release 23 StructuredConcurrencyExample.java
java --enable-preview StructuredConcurrencyExample

優勢

  • 簡化并發:將相關任務組織為一個單元。
  • 錯誤處理:統一處理任務失敗。
  • 可觀察性:提高并發代碼的可維護性。

參考:JEP 480

3.7. 作用域值 (第三次預覽) (JEP 481)

背景與用途

JEP 481引入了作用域值(Scoped Values),允許在線程及其子線程間共享不可變數據,替代線程局部變量,適合傳遞上下文數據。

使用示例

import jdk.incubator.concurrent.ScopedValue;public class ScopedValueExample {private static final ScopedValue<String> USER = ScopedValue.newInstance();public static void main(String[] args) throws Exception {ScopedValue.runWhere(USER, "Alice", () -> {System.out.println("當前用戶: " + USER.get());});}
}

啟用方法

編譯和運行時需啟用預覽特性:

javac --enable-preview --release 23 ScopedValueExample.java
java --enable-preview ScopedValueExample

優勢

  • 不可變性:確保數據安全。
  • 輕量級:比線程局部變量更高效。
  • 上下文傳遞:適合傳遞事務ID、用戶信息等。

參考:JEP 481

3.8. 靈活的構造器體 (第二次預覽) (JEP 482)

背景與用途

JEP 482允許在構造器中調用方法或執行邏輯,在調用this()super()之前,提高代碼復用性。

傳統方式與新特性的對比

在Java 22及之前,構造器中不能在this()super()之前調用實例方法:

class Point {int x, y;Point(int x, int y) {if (x < 0 || y < 0) {throw new IllegalArgumentException("坐標必須為非負數");}this.x = x;this.y = y;}
}

在Java 23中,可以提前調用驗證方法:

class Point {int x, y;Point(int x, int y) {validate(x, y);this.x = x;this.y = y;}private void validate(int x, int y) {if (x < 0 || y < 0) {throw new IllegalArgumentException("坐標必須為非負數");}}
}

使用示例

class PositivePoint extends Point {PositivePoint(int x, int y) {if (x <= 0 || y <= 0) {throw new IllegalArgumentException("坐標必須為正數");}super(x, y);}
}

啟用方法

編譯和運行時需啟用預覽特性:

javac --enable-preview --release 23 PositivePoint.java
java --enable-preview PositivePoint

優勢

  • 代碼復用:減少構造器中的重復邏輯。
  • 靈活性:允許更復雜的初始化邏輯。
  • 可讀性:使構造器代碼更清晰。

參考:JEP 482

4. 孵化特性

4.1. 向量API (第八次孵化) (JEP 469)

背景與用途

JEP 469繼續孵化向量API,允許開發者編寫可編譯為硬件優化的向量計算代碼,適用于數值計算、機器學習等場景。

使用示例

以下示例計算兩個數組的點積:

import jdk.incubator.vector.*;public class VectorAPIExample {private static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;public static void main(String[] args) {float[] a = {1.0f, 2.0f, 3.0f, 4.0f};float[] b = {5.0f, 6.0f, 7.0f, 8.0f};float result = 0.0f;FloatVector va = FloatVector.fromArray(SPECIES, a, 0);FloatVector vb = FloatVector.fromArray(SPECIES, b, 0);result = va.mul(vb).reduceLanes(VectorOperators.ADD);System.out.println("點積: " + result);}
}

啟用方法

編譯和運行時需啟用預覽特性:

javac --enable-preview --release 23 VectorAPIExample.java
java --enable-preview VectorAPIExample

優勢

  • 性能優化:利用硬件向量指令提高計算效率。
  • 跨平臺:在支持的硬件上自動優化。
  • 適用性:適合高性能計算場景。

參考:JEP 469

5. 結語

Java 23通過12個JEP為開發者帶來了豐富的功能,從簡化文檔編寫的Markdown支持到增強并發編程的結構化并發,再到性能優化的ZGC代際模式,這些特性顯著提升了Java的開發體驗和程序性能。正式特性可立即用于生產環境,而預覽和孵化特性則為開發者提供了嘗試尖端功能的機會,同時為未來的LTS版本(如Java 25)奠定基礎。

我們鼓勵開發者在非生產環境中測試預覽特性,并通過OpenJDK社區提供反饋,以幫助完善這些功能。無論您是開發高性能應用、編寫教學代碼還是維護大型項目,Java 23的新特性都為您提供了強大的工具。立即下載JDK 23,探索這些新功能,并在您的項目中釋放Java的潛力!

參考文獻

JEP編號標題鏈接
455原始類型在模式、instanceof和switch中的支持 (預覽)JEP 455
466類文件API (第二次預覽)JEP 466
467Markdown文檔注釋JEP 467
469向量API (第八次孵化)JEP 469
471廢棄sun.misc.Unsafe的內存訪問方法以移除JEP 471
473流收集器 (第二次預覽)JEP 473
474ZGC:默認啟用代際模式JEP 474
476模塊導入聲明 (預覽)JEP 476
477隱式聲明類和實例主方法 (第三次預覽)JEP 477
480結構化并發 (第三次預覽)JEP 480
481作用域值 (第三次預覽)JEP 481
482靈活的構造器體 (第二次預覽)JEP 482

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917248.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917248.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917248.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring boot + mybatis + mysql 只有一個實體類的demo

使用MyBatis進行數據庫操作&#xff0c;配置簡單。主要演示了mybatis可以不用只使用方法名來對應mapper.java和mapper.xml。 目錄結構 pom.xml src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── springbootjdbcweb/ │ │ └── …

iRemovalPro完美繞iCloud插卡打電話,A12+支持iOS 18.1.1

iRemovalPro 專業工具全解析與操作指南 &#xff08;支持iOS 14.0 - 16.6.1&#xff0c;A7-A15芯片設備&#xff09; &#x1f449;下載地址見文末 iRemoval Pro iRemoval 專業版是一款來自外國安全研究員的工具&#xff0c;用來幫助一些人因為忘記自己的ID或者密碼&#xff0c…

安卓SELinux策略語法

目錄前言一、 通用AV規則語法1.1 allow source target:class permissions;1.2 neverallow source target:class permissions;二、type三、attribute四、typeattribute五、alias六、typealias七、init_daemon_domain7.1 init_daemon_domain 宏概述7.2 宏展開與實現7.2.1 展開后規…

vscode cursor配置php的debug,docker里面debug

VSCode PHP調試配置指南 概述 本文介紹如何在VSCode中配置PHP調試環境&#xff0c;包括本地和Docker環境。 前置要求 VSCodePHP 7.0Xdebug擴展PHP Debug VSCode擴展 本地調試配置 1. 安裝Xdebug # Ubuntu/Debian sudo apt-get install php-xdebug# MacOS brew install p…

elk部署加日志收集

清華大學鏡像源地址&#xff1a;Index of /elasticstack/8.x/yum/8.13.2/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror 一、elasticsearch 1.安裝 rpm -ivh elastic-agent-8.13.2-x86_64.rpm 2.修改配置 vim /etc/elasticsearch/elasticsearch.yml 修改如下&…

dify 升級1.7.1 插件無法下載依賴

dify 升級1.7.1 插件無法下載依賴 1. 安裝通義千問插件&#xff0c;各種報錯&#xff1b; 使用下面命令查看docker 鏡像日志 docker logs -f --tail100 docker-plugin_daemon-1 2025/08/01 07:42:21 full_duplex.go:59: [INFO]init environment for plugin langgenius/tongyi…

linux中簡易云盤系統項目實戰:基于 TCP協議的 Socket 通信、json數據交換、MD5文件區別與多用戶文件管理實現

&#x1f4cb; 項目介紹 本項目是一個基于Linux環境的簡易云盤系統&#xff0c;采用C/S&#xff08;客戶端/服務器&#xff09;架構&#xff0c;實現了類似百度網盤的基本功能。系統通過TCP Socket進行網絡通信&#xff0c;使用JSON格式進行數據交換&#xff0c;利用SQLite3數據…

linux中posix消息隊列的使用記錄

在linux中使用posix中的消息隊列時遇到了一個問題&#xff0c;就是在發送消息時&#xff0c;如果隊列滿了&#xff0c;mq_send接口會一直阻塞&#xff0c;經過查找資料后才發現&#xff0c;該接口默認是阻塞的&#xff0c;也就是說&#xff0c;當隊列滿了以后&#xff0c;接口會…

01 基于sklearn的機械學習-機械學習的分類、sklearn的安裝、sklearn數據集及數據集的劃分、特征工程(特征提取與無量綱化、特征降維)

文章目錄機械學習機械學習分類1. 監督學習2. 半監督學習3. 無監督學習4. 強化學習機械學習的項目開發步驟scikit-learn1 scikit-learn安裝2 sklearn數據集1. sklearn 玩具數據集鳶尾花數據集糖尿病數據集葡萄酒數據集2. sklearn現實世界數據集20 新聞組數據集3. 數據集的劃分特…

n8n】n8n的基礎概念

以下是為初學者整理的 n8n 基本概念總結&#xff0c;幫助快速理解核心功能和使用邏輯&#xff1a;1. 工作流&#xff08;Workflow&#xff09;核心單元&#xff1a;n8n的一切操作基于工作流&#xff0c;代表一個自動化流程。組成&#xff1a;由多個節點&#xff08;Nodes&#…

機器學習基礎-matplotlib

一、相關知識點二、plotfrom pylab import mpl # 設置顯示中文字體 mpl.rcParams["font.sans-serif"] ["SimHei"] # 設置正常顯示符號 mpl.rcParams["axes.unicode_minus"] False #%%#%% import matplotlib.pyplot as plt import random# 畫出…

spring-ai-alibaba 學習(十九)——graph之條件邊、并行節點、子圖節點

前面了解了基礎的概念及流程&#xff0c;以及一些參數類下面了解一些特殊的邊和節點條件邊常見的流程圖可能長這個樣子&#xff1a;其中菱形的為條件節點&#xff08;或者叫判定節點&#xff09;&#xff0c;但是在spring-ai-alibaba-graph中&#xff0c;并沒有條件節點在sprin…

深入淺出設計模式——創建型模式之原型模式 Prototype

文章目錄原型模式簡介原型模式結構關于克隆方法&#xff1a;淺拷貝/深拷貝原型模式代碼實例定義原型類和克隆方法客戶端使用代碼示例示例一&#xff1a;淺拷貝示例二&#xff1a;深拷貝原型模式總結開閉原則代碼倉庫原型模式&#xff1a;用原型實例指定創建對象的種類&#xff…

.NET 10 中的新增功能系列文章3—— .NET MAUI 中的新增功能

.NET 10 預覽版 6 中的 .NET MAUI.NET 10 預覽版 5 中的.NET MAUI.NET 10 預覽版 4 中的 .NET MAUI.NET 10 預覽版 3 中的 .NET MAUI.NET 10 預覽版 2 中的 .NET MAUI.NET 10 預覽版 1 中的 .NET MAUI 一、MediaPicker 增強功能&#xff08;預覽版6&#xff09; .NET 10 預覽…

MT Photos圖庫部署詳解:Docker搭建+貝銳蒲公英異地組網遠程訪問

如今&#xff0c;私有化部署輕量級圖床/圖庫系統&#xff0c;已經成為越來越多用戶的高頻需求。而MT Photos&#xff0c;正是一款非常適合在Docker環境下運行的自托管圖床/圖庫系統。MT Photos基于Node.js與Vue構建&#xff0c;界面簡潔美觀&#xff0c;支持多用戶權限管理、多…

解決dbeaver連接不上oceanbase數據庫的問題

解決dbeaver連接不上oceanbase數據庫的問題 問題&#xff1a; 使用dbeaver連接oceanbase數據庫報錯如下&#xff1a; ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘dat…

Kafka——請求是怎么被處理的?

引言在分布式消息系統中&#xff0c;請求處理機制是連接客戶端與服務端的"神經中樞"。無論是生產者發送消息、消費者拉取數據&#xff0c;還是集群內部的元數據同步&#xff0c;都依賴于高效的請求處理流程。Apache Kafka作為高性能消息隊列的代表&#xff0c;其請求…

區塊鏈技術如何確保智能合約的安全性和可靠性?

智能合約作為區塊鏈上自動執行的可編程協議&#xff0c;其安全性和可靠性直接決定了區塊鏈應用的信任基礎。區塊鏈通過底層技術架構、密碼學工具和機制設計的多重保障&#xff0c;構建了智能合約的安全防線。以下從技術原理、核心機制和實踐保障三個維度展開分析&#xff1a;一…

2020 年 NOI 最后一題題解

問題描述2020 年 NOI 最后一題是一道結合圖論、動態規劃與狀態壓縮的綜合性算法題&#xff0c;題目圍繞 "疫情期間的物資配送" 展開&#xff0c;具體要求如下&#xff1a;給定一個有向圖 G (V, E)&#xff0c;其中節點代表城市&#xff0c;邊代表連接城市的道路。每個…

加密與安全

目錄 一、URL編碼&#xff1a; 二、Base64編碼&#xff1a; 三、哈希算法&#xff1a; 四、Hmac算法&#xff1a; 五、對稱加密算法&#xff1a; 一、URL編碼&#xff1a; URL編碼是瀏覽器發送數據給服務器時使用的編碼&#xff0c;它通常附加在URL的參數部分。之所以需要…