java15學習筆記-密封類

360:Sealed Classes (Preview)? 封閉類(預覽)

總結

????????使用密封類和接口增強Java編程語言。密封類和接口限制了哪些其他類或接口可以擴展或實現它們。這是JDK 15中的預覽語言功能。

目標

????????允許類或接口的作者控制負責實現它的代碼。
????????提供一種比訪問修飾符更具聲明性的方式來限制超類的使用。
????????通過支持對模式的詳盡分析,支持模式匹配的未來方向。

動機

????????在Java中,類層次結構允許通過繼承重用代碼:超類的方法可以被許多子類繼承(并因此重用)。然而,類層次結構的目的并不總是重用代碼。有時,它的目的是對領域中存在的各種可能性進行建模,例如圖形庫支持的形狀類型或金融應用程序支持的貸款類型。當以這種方式使用類層次結構時,限制子類集可以簡化建模。
????????例如,在圖形庫中,Shape類的作者可能希望只有特定的類可以擴展Shape,因為該庫的大部分工作都涉及以適當的方式處理每種形狀。作者對處理Shape的已知子類的代碼的清晰度感興趣,對編寫代碼來防御Shape的未知子類不感興趣。在這種情況下,允許任意類擴展Shape,從而繼承其代碼以供重用,并不是我們的目標。不幸的是,Java認為代碼重用始終是一個目標:如果Shape可以擴展,那么它可以擴展任意數量的類。放寬這一假設會有所幫助,這樣作者就可以聲明一個不允許任意類擴展的類層次結構。在這樣一個封閉的類層次結構中,代碼重用仍然是可能的,但在更大的范圍內是不可能的。
????????Java開發人員熟悉限制子類集的想法,因為它經常出現在API設計中。該語言在這方面提供了有限的工具:要么將類設為final,這樣它就沒有子類,要么將類或其構造函數包設為私有,這樣它只能在同一個包中有子類。JDK中出現了一個包私有超類的示例:

package java.lang;abstract class AbstractStringBuilder {...}
public final class StringBuffer  extends AbstractStringBuilder {...}
public final class StringBuilder extends AbstractStringBuilder {...}


????????當目標是代碼重用時,包私有方法很有用,例如AbstractStringBuilder的子類共享其代碼進行追加。然而,當目標是對替代方案進行建模時,這種方法是無用的,因為用戶代碼無法訪問關鍵抽象(超類)以進行切換。不允許用戶在不擴展超類的情況下訪問超類是不可能的。(即使在聲明Shape及其子類的圖形庫中,如果只有一個包可以訪問Shape,那也會很不幸。)
總之,超類應該可以廣泛訪問(因為它代表了用戶的一個重要抽象),但不能廣泛擴展(因為它的子類應該僅限于作者已知的子類)。這樣的超類應該能夠表示它是與一組給定的子類共同開發的,既可以為讀者記錄意圖,也可以允許Java編譯器執行。同時,超類不應過度約束其子類,例如強制它們為最終類或阻止它們定義自己的狀態。

示例

public abstract sealed class  Shape permits Circle, Rectangle, Square {
}
public non-sealed class Square extends Shape {void side() {System.out.println("邊長");}
}
public non-sealed class Rectangle implements Shape {void length() {System.out.println("長度");}
}
public non-sealed class Circle extends Shape {void center() {System.out.println("圓心");}
}
    public static void fun(Shape shape){switch (shape){case Circle c    ->  c.center();case Rectangle r ->  r.length();case Square s    -> s.side();default -> throw new IllegalStateException("Unexpected value: " + shape);}}public static void main(String[] args) {Shape s1= new Circle();Shape s2= new Rectangle();Shape s3= new Square();fun(s1);fun(s2);fun(s3);}

注意

使用sealed關鍵字聲明封閉類或封閉接口
使用permits關鍵字允許聲明哪個類或接口可以成為其子類或子接口
sealed修飾過的類或接口必須有類繼承或實現
sealed也可以修飾接口interface
繼承或者實現被sealed修飾過的類或接口,必須用sealed(密封),final(最終),non-sealed(非密封)修飾

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

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

相關文章

西門子PLC通過穩聯技術EtherCAT轉Profinet網關連接baumuller伺服器的配置案例

西門子PLC用穩聯技術的EtherCAT轉Profinet網關,連上baumuller伺服器的配置例子本案例實現西門子S71200 PLC通過EtherCAT轉Profinet網關對baumuller(Baumller)伺服器的實時控制,適用于高精度運動控制場景(如精密機床、自…

Ansible 詳細筆記

Ansible 詳細筆記 一、Ansible 基礎概述 1.1 定義與定位 Ansible 是由 Red Hat 主導開發的開源自動化運維工具,基于 Python 語言實現,專注于簡化 IT 基礎設施的配置管理、應用部署、任務編排等操作。它采用無代理架構,通過 SSH 協議與被控節點…

【Java 后端】Spring Boot 集成 JPA 全攻略

Spring Boot 集成 JPA 全攻略 一、前言 在 Java Web 開發中,數據庫訪問是繞不開的話題。 傳統方式使用 JDBC 編寫 SQL,維護困難、可讀性差。后來有了 MyBatis 這種半自動 ORM 框架,再到 JPA(Java Persistence API)這…

pytorch學習筆記-加載現有的網絡模型(VGG16)、增加/修改其中的網絡層(修改為10分類)

寫在前面:有些地方和視頻里不一樣的是因為官方文檔更新了,一些參數用法不一樣也很正常,包括我現在的也是我這個時間節點最新的,誰知道過段時間會不會更新呢 建議大家不要一味看視頻/博客,多看看官方文檔才是正道&#…

RocketMQ 4.9.3源碼解讀-NameServer組件啟動流程分析

作者源碼閱讀筆記主要采用金山云文檔記錄的,所有的交互圖和代碼閱讀筆記都是記錄在云文檔里面,本平臺的文檔編輯實在不方便,會導致我梳理的交互圖和文檔失去原來的格式,所以整理在文檔里面,供大家閱讀交流 【金山文檔 | WPS云文檔】 namesrv 啟動流程 相關重要類介紹說明…

《嵌入式 C 語言編碼規范與工程實踐個人筆記》參考華為C語言規范標準

《嵌入式 C 語言編碼規范與工程實踐個人筆記》參考華為C語言規范標準 前言 在電子系統開發領域,C 語言作為底層開發的核心語言,其代碼質量直接關系到系統的穩定性、可維護性和擴展性。良好的編碼規范不僅是團隊協作的基礎,更是降低生命周期成…

純半精度模型和全精度模型的耗時分別為248微秒和1400微秒。混合精度模型371微秒比原始模型快大約四倍!

不過有一點需要注意:在上下文管理器內部生成的任何輸出,必然會采用該上下文管理器的數據類型。因此,之后我們必須將這些輸出轉換回FP32(例如,使用float()函數)。 with torch.autocast(device_type="cuda", dtype=torch.float16): res16 = mixed32(torch.randn…

一款開源的遠程桌面軟件,旨在為用戶提供流暢的游戲體驗,支持 2K 分辨率、60 FPS,延遲僅為 40ms。

軟件介紹 CloudPlayPlus(云玩加)是一款令人驚艷的開源遠程桌面、串流軟件,云玩加由個人開發者開發者,具有四大特征:開源、免費、低延遲、安全。 軟件使用 客戶端支持多個平臺,包括 Windows、Mac OS、安卓…

MySql——binlog和redolog的區別

目錄一、binlog和redolog的區別一、binlog和redolog的區別 binlog和redolog都是存儲修改的新數據,是否保留binlog和redolog中的一個即可。 binlog屬于整個mysql,是所有引擎共用的,不是只屬于innoDB引擎。而redolog屬于InnoDB存儲引擎。binlo…

軟件著作權產生與登記關鍵點

知識講解一、 軟件著作權的核心特征與權利內容自動產生原則: 這是軟件著作權最核心、最重要的特征。產生時間: 軟件著作權自軟件開發完成之日起自動產生。法律依據: 《中華人民共和國著作權法》第二條及《計算機軟件保護條例》第五條明確規定…

什么是主成分分析(PCA)和數據降維

主成分分析(PCA)和數據降維是機器學習和統計學中處理高維數據的核心工具。下面用清晰的結構解釋其概念、原理和應用: 一、數據降維(Dimensionality Reduction) 1. 是什么? 目標:將高維數據&…

圖論(4)單源賦權最短路徑算法實現(BFS實現)

目錄 1. 什么是賦權最短路徑 2. 賦權最短路徑中的關鍵概念 3. Dijkstra 算法的基本思想 4. Dijkstra 算法實現(Java) 1. 什么是賦權最短路徑 在圖論中,最短路徑問題是指在圖中尋找兩點之間路徑總權重最小的路徑問題。如果圖的每條邊都帶…

【Lua】題目小練9

題目:實現一個簡單的“銀行賬戶”類要求:使用 元表 模擬面向對象。支持以下功能:Account:new(owner, balance) 創建賬戶(初始余額可選,默認為 0)。deposit(amount) 存款(不能為負數)…

【二分圖】染色問題

核心思想&#xff1a;為每一個未染色的&#xff0c;對它自己和它的鄰居進行染色&#xff0c;看是否會出現沖突時間復雜度O&#xff08;nm&#xff09;#include<bits/stdc.h> using namespace std; using lllong long; const int N200010; int n,m; vector<int>edge…

報數游戲(我將每文更新tips)

今日tips&#xff1a;報數游戲題目描述報數游戲的游戲規則如下&#xff1a;對一個區間內的整數進行報數&#xff0c;若遇到的數字是質數或個位數是 1&#xff0c;則不報數&#xff0c;輸出 pass。 給定開始游戲的第一個整數 a&#xff0c;及結束游戲時的最后一個整數 b&#xf…

大模型開發 - 基于Spring AI 借助MCP Client 通過STDIO和SSE協議調用MCP Server (上)

文章目錄概述MCP協議&#xff1a;為AI應用連接外部世界的橋梁MCP Server&#xff1a;上下文與能力的提供者基于Spring AI 1.0.0的開發之路1. 使用Spring AI構建MCP客戶端2. 使用Spring AI構建MCP服務器Mcp Client 實戰整體架構概覽技術棧Codepom配置mcp servers(sse&stdio)…

分析三個文件--啟動文件、鏈接文件、map文件

目錄 啟動文件 鏈接文件 部分map文件內容 FLASH物理地址(0x08000000開始)的映射關系 0x08000000 之前地址空間 啟動文件 ;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** ;* File Name : startup_stm32f40_41xxx.s ;* Author…

從零開始學Python之數據結構(字符串以及數字)

一、字符串 1.1 怎么定義字符串 字符串是Python最常用的數據結構之一。在 Python 里是用于處理文本數據的&#xff0c;比如存儲姓名、文章內容等文本信息 。 定義方式&#xff1a; 單引號&#xff1a;用單引號 包裹文本&#xff0c;如 name Alice &#xff0c;單引號內可…

Navicat 全量增量數據庫遷移

在使用 Navicat 進行數據庫遷移時&#xff0c;除了常見的“全量遷移”&#xff08;一次性遷移所有數據和結構&#xff09;&#xff0c;有時還需要支持 增量遷移&#xff08;只遷移新增或修改的數據&#xff09;。下面我將詳細講解如何通過 Navicat 實現&#xff1a;&#x1f50…

css初學者第五天

<1>css的三大特性1.1 層疊性相同選擇器給設置相同的樣式&#xff0c;此時一個樣式就會覆蓋&#xff08;層疊&#xff09;另一份沖突的樣式。層疊式主要解決樣式沖突的問題。層疊性原則&#xff1a;-樣式沖突&#xff0c;遵循的原則是就近原則&#xff0c;哪個樣式離結構近…