首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏韩曙亮的移动开发专栏

    【Kotlin】Kotlin Sealed 密封 ( 密封声明 | 密封子类定义 | 密封特点 | 代码示例 )

    密封概念 II . 密封声明 III. 密封注意事项 IV . 密封 示例代码 I . 密封概念 ---- 1 . 密封作用 : 定义一个密封 , 该类只能有有限个指定的子类 , 不能在其它文件定义其它类型子类 ; 2 . 密封声明 ---- 1 . 密封声明 : 在 class 前添加 sealed 修饰符 , 即可将该类声明为密封 ; sealed class Student{} 2 . 密封注意事项 ---- 1 . 抽象本质 : 密封本质是抽象 , 其类型不能被实例化 , 只能实例化其子类 ; 2 . 密封子类 : ① 定义在密封内部 ( 推荐 ) : 密封的子类建议定义在密封内部 , 可以兼容所有版本 ; ② 定义在密封所在文件 : Kotlin 1.1 以后的版本 , 可以将密封子类定义在密封声明的同一个文件中

    1.9K10编辑于 2023-03-27
  • 来自专栏安卓开发

    密封总结

    简介 sealed 修饰的称为密封,用来表示受限的层次结构。 案例 // 外部无法实例化密封 // 外部只能实例化他的子类 sealed class Color { // 只能在内部继承密封 class Red(val value: Int) Color.Red -> TODO() is Color.Green -> TODO() is Color.Blue -> TODO() } } 案例 // 默认情况下,密封的构造函数是私有的 // 密封的所有子类必须在同一文件中声明。 sealed class A { class B : A() { // this works. class F: A() } 案例 // 在密封中添加数据和对象 sealed class A { class B : A() class C : A() object

    1.2K40发布于 2021-04-01
  • 来自专栏Android Note

    Kotlin —  Sealed Classes(密封

    我先翻译为密封吧O__O "…。 什么是密封? 官方文档:密封用于表示受限的层次结构,当一个值有一个有限的类型,但不能有任何其他类型。 它们在某种意义上是枚举的扩展:枚举类型的值的集合也受到限制,但是每个枚举常量只能作为一个单独的实例存在,而一个密封的子类可以有多个可以包含状态的实例。 如何声明密封? data class WhitePerson(val name:String,age:Int):Person() object BlackCat:Person() } 当在表达式中使用它们时,密封的便捷就会体现出来

    64230发布于 2018-07-02
  • 来自专栏Android 开发者

    Kotlin Vocabulary | 密封 sealed class

    而 sealed class (本文下称 "密封" ) 则同时包含了前面两者的优势 —— 抽象表示的灵活性和枚举里集合的受限性。 /video/BV1Nk… 密封的基本使用 和抽象类似,密封可用于表示层级关系。 子类可以是任意的: 数据、Kotlin 对象、普通的,甚至也可以是另一个密封。但不同于抽象的是,您必须把层级声明在同一文件中,或者嵌套在的内部。 使用 when 语句处理密封时,如果没有覆盖所有情况,可以让编译器给我们一个错误提示。 工作原理 为何密封会拥有这些特性?

    1.4K10发布于 2020-04-03
  • 来自专栏Java面试教程

    Java中密封的介绍

    事实上,引入了几个新的关键字来支持密封密封和非密封。 这些扩充了继承的经典概念,在继承概念中,只有一组特定的子类才能扩展父。因此,本质上,Final不允许继承。 它实际上由两个极端组成:Final和Abstract,前者完全阻止继承,后者强制继承。Sealed使开发人员能够精确地指定允许哪些子类扩展超级。 因为有密封,所以也有密封接口。 换句话说,密封的子类必须声明为final、sealed或非sealed。 B {} // 喏,现在可以继承了 现在,假设我们希望A由B和C扩展,我们也希望D扩展B,但我们不希望D声明为final、非密封密封,那么我们可以按如下方式设计: Public sealed 密封和子类必须位于同一个命名模块中,尽管它们可以位于不同的包中。 对于未命名的模块,密封和子类必须在同一个包中。 Java中的密封接口 密封接口的声明方式与密封几乎相同。

    1.6K10编辑于 2023-03-07
  • 来自专栏码农小胖哥的码农生涯

    Java(接口)的新类型——密封

    如果不对该功能的继承实现进行限制,开发人员将很容易滥用该功能的实现,错误地重用一些代码。这就是密封产生的原因。 密封的声明 ❝密封不仅仅可以是,也可以是接口。 文章中的密封为统称 密封(接口)可以明确哪些和接口可以对其扩展或实现。你可以通过sealed修饰符来表明某个密封。 "); } } 密封子类的类型 在上面示例中,密封(接口)的实现用了final关键字标记,当然密封的实现还可以是密封: /** * 密封子类 */ public sealed 答案是否定的,只需要使用关键字non-sealed显式声明密封的继承实现为非密封就可以继续扩展了。 ❝密封中permits关键字声明的子类必须是直接子类,不可间接实现。 密封不支持匿名和函数式接口 由于密封必须明确继承实现关系,所以它不支持匿名

    2K00发布于 2021-11-12
  • 来自专栏xixi

    学习记录——抽象密封

    如果将看做是模板,那么抽象就是一个不完整的模板,我们不能使用不完整的模板去构造对象。 抽象成员 通过在定义前面放置关键字 abstract,可以将声明为抽象。 例如,库可以定义一个抽象,将其用作多个库函数的参数,并要求使用该库的程序员通过创建派生来提供自己的实现。 抽象也可以定义抽象方法。 ②密封 密封成员 通过在定义前面放置关键字 sealed,可以将声明为密封。 例如: public sealed class D { // Class members here. } 密封不能用作基。 因此,它也不能是抽象密封禁止派生。 由于密封从不用作基,所以有些运行时优化可以略微提高密封成员的调用速度。 在对基的虚成员进行重写的派生上,方法、索引器、属性或事件可以将该成员声明为密封成员。

    62431编辑于 2022-01-28
  • 来自专栏藏经阁

    【JDK15 新特性】密封

    新特性 通过密封和接口来限制超的使用,密封和接口限制其它可能继承或实现它们的其它或接口。 具体使用: 使用修饰符sealed,可以将一个声明为密封密封使用保留关键字permits列出可以直接扩展(即extends)它的。 final:子类为finall,间接表示父不能被其他继承 sealed:子类也可以声明为密封 non-sealed:声明为非密封,可以被其他继承 举例: public abstract sealed //密封 public final class Circle extends Shape {...} //子类也是一个密封 public non-sealed class Square extends Shape {...} //non-sealed表示子类不是一个密封,可以被任何继承

    62830编辑于 2023-03-09
  • 来自专栏韩曙亮的移动开发专栏

    【Kotlin】常用的 Kotlin ② ( 枚举 | 枚举定义函数 | 密封 )

    文章目录 一、枚举 二、枚举定义函数 1、枚举定义普通函数 2、枚举定义构造函数 三、密封 一、枚举 ---- Kotlin 中使用 枚举 定义常量 , 枚举定义格式如下 : 枚举常量 main() { Gender.MALE.log() Gender.FEMALE.log() } 执行结果 : Gender, MALE 0, FEMALE 1, id = 0 三、密封 ---- 枚举类型 是一组 子类型 闭集 ; 密封 可以 定义 枚举类型的 子类型闭集 , 一个密封可以有多个子类 , 继承密封的子类 必须 与 密封在相同的 Kotlin 代码文件中 ; 密封适用于这种情况 , 要使用枚举的特性 , 但是需要在枚举基础上保存多个特性 ; 枚举只能实现简单的常量列举 , 如果需要更复杂的 子类型闭集 , 则需要使用密封 ; 代码示例 : sealed class Gender { // Male 和 Female 都是 密封 Gender 的子类 object Male: Gender() object Female: Gender() } class

    1.7K10编辑于 2023-03-30
  • 来自专栏Bennyhuo

    Java 17 更新(8):密封终于转正

    Java 看 Kotlin 实现了密封,马上给自己搞了密封密封接口,Kotlin 一看也立马支持了密封接口。 密封从 Java 15 开始预览,Java 16 又预览了一波,终于在 Java 17 转正了(实际上 Java 16 和 17 的密封是一样的)。 —— 直到 Java 也支持密封密封接口,Kotlin 才也对密封接口做了支持。 因此我们说密封可以确保其直接子类可数。 密封实际上也是一个很有用的特性,我之前在介绍 Kotlin 的密封的时候也已经提到过不少它的用法,感兴趣的小伙伴可以看一下这个视频: 就像视频当中提到的那样,我们可以用密封实现递归列表: public

    1.8K10发布于 2021-10-19
  • 来自专栏InCerry

    为什么要把设置成密封

    前几天笔者提交了关于FasterKvCache的性能优化代码,其中有一个点就是我把一些后续不需要继承的设置为了sealed密封,然后就有小伙伴在问,为啥这个地方需要设置成sealed? // 非密封的派生 internal class NonSealedType : BaseType { public override void Method() { } } // 密封的派生 我们可以看到 JIT 生成后的汇编代码,可以很清楚的看到密封少了两条指令,因为 JIT 可以从密封中知道它不可能被继承,也不可能被重写,所以是直接跳转到密封类目标方法执行,而非密封还有一个查表的过程 对象类型转换 (is / as) 同样有下面这样一段代码,测试密封和非密封的对象类型转换性能: public class SealedBenchmark { readonly BaseType IL 层面,两个方法都是一模一样: 可以看到密封的代码相当高效,直接比较一下就转换类型返回了,而非密封还需要 call 方法走查表流程: 数组 .NET 的数组是协变的,协变兼容的话就意味着在添加进入数组时需要检查它的类型

    55720编辑于 2023-03-08
  • 来自专栏Android干货园

    Kotlin中级(9)- - - Kotlin之数据密封、内部类.md

    Int) 2.数据声明条件 主构造函数最少要有一个参数 数据的主构造器的所有参数必须标记为val或var 数据不能是抽象、open、封闭、内部类 数据不能继承自任何其他(但可以实现接口) (Koltin要修改数据的属性,则使用其独有的copy()函数。其作用就是:修改部分属性,但是保持其他不变) 密封 1. 但是,我们知道Kotlin的枚举中的枚举常量是受限的,因为每一个枚举常量只能存在一个实例 但是其和枚举不同的地方在于,密封的一个子类可以有可包含状态的多个实例。 也可以说成,密封是包含了一组受限的集合,因为里面的都是继承自这个密封的。但是其和其他继承(open)的区别在,密封可以不被此文件外被继承,有效保护代码。 但是,其密封的子类的扩展是是可以在程序中任何位置的,即可以不在同一文件下 2.声明 sealed class SealedExpr() 内部类(嵌套) 在实际开发中,用到内部类的地方是很多的。

    1.5K20发布于 2018-09-30
  • 来自专栏程序猿DD

    详解 Java 17中的新特性:“密封

    Sealed Classes有两种主流翻译:密封、封闭。个人喜欢前者多一些,所以在本文中都称为密封。 而密封的作用就是限制的继承。 新手段:密封 为了进一步增强限制能力,Java 17中的密封增加了几个重要关键词: sealed:修饰/接口,用来描述这个/接口为密封/接口 non-sealed:修饰/接口,用来描述这个 就可以通过引入密封的特性来做限制。 :继续延续密封特性,可以继续指定继承的,并传递密封定义给子类 non-sealed:声明这个为非密封,可以被任意继承 final:不允许继承 根据上面的假设需求,第一、第二层稳定,允许第三层具体英雄角色可以后期不断增加新英雄

    98630编辑于 2022-05-05
  • 来自专栏云计算linux

    JDK15新特性密封可以被继承了!

    2020-9-15发布了JDK15 JDK15一共有14个新特性,其中最为笔者印象深刻的莫过于对于——密封可以被继承 密封从刚开始学就从各种途径了解到不能被继承,新版本的密封如果想要被继承需要用 permits指定被继承的 同时,被继承的需要用final,sealed或者non-sealed修饰 正常的一个代码思路 publicclassPerson{ } classTeacherextendsPerson } //研究生 classWorkerextendsPerson{ } //工人 classRailWayWorkerextendsWorker{ } //铁路工人 这时如果想让密封被继承就需要用 non-sealedclassWorkerextendsPerson{ } //工人 classRailWayWorkerextendsWorker{ } //铁路工人 可以看到,继承密封 , 如果是密封还要继承的话,还需要指定 如果是非密封的话,就可以正常使用,正常被继承。

    15900编辑于 2024-12-19
  • 来自专栏架构之巅

    大清秘史之大话JDK17 中的密封

    在 Java 17 中,sealed 密封)就像是 ️ 皇位继承制度 ,它明确规定:哪些可以继承自己,不允许“外人”随意篡位! 核心概念用 sealed 修饰的,必须通过 permits 指定谁能继承它。 因为他不在 permits 名单里,无法继承“清朝皇帝”这个。正统皇帝也可以宣布不传位给儿子们 non-sealed不再世袭罔替 实际作用 严格管控继承:避免被随意扩展,破坏设计。 配合模式匹配:用 switch 检查密封子类时,编译器能智能判断是否覆盖所有情况。 ,需继续声明 permitsnon-sealed表示该子类不再限制继承,任何都可继承它,等价于不使用sealed,因为语法限制,不可省略✨ 总结密封就是 “正大光明匾后面的皇位继承名单” ,既保证了血统纯正

    20320编辑于 2025-12-09
  • 来自专栏zinyan

    Groovy 孵化功能-记录record和密封sealed的学习

    密封-sealed关键字 密封、接口和特性(traits)限制了哪些子类可以扩展/实现它们。在密封出现之前,层次结构设计者有两个主要选择: 设置一个关键字为final不允许扩展。 将设为public和非final,以允许任何人扩展。 与这些要么全有要么全无的选择相比,密封提供了一个中间地带。 密封也比以前用于实现中间地带的其他技巧更灵活。 创建一个不可变的Hexagon 继承Polygon final class Hexagon extends Polygon { } //创建一个密封,继承Shape 仅许可Square sealed 然后创建的Rectangle是密封的,只允许一种控制的方法进行扩展就是Square。 密封用于创建类似枚举的相关,这些需要包含特定于实例的数据。 Groovy支持注解方式创建密封和接口,也支持使用sealed关键字创建密封和接口。

    1.4K20编辑于 2023-02-23
  • 来自专栏联远智维

    密封方案设计—易拉罐

    密封性设计在生活中以及工业中具有广泛的应用,本节对现有的密封方案进行调研分析,理解各种密封的基本原理。 现有密封的方法有主要包含动密封和静密封两种,具体的应用场景如表1所示: 密封材料:随着科学技术的发展,密封技术广泛应用于高温,高压及高腐蚀性等场合,传统的密封材料如毛毡、麻丝、石棉丝、油灰等已不能满足使用要求 No.1 易拉罐密封 易拉罐在生活中具有广泛的应用,具有较好的密封性能,基本结构包含中间圆筒以及顶盖两部分(部分饮料由底盖、端盖以及圆筒三部分组成),具体如图1所示: 易拉罐通过金属材料的变形行为实现密封 ,不涉及复杂的零部件,在确保良好经济性的同时具有较高的可靠性,在生活中具有广泛的应用,不知道你对易拉罐的密封方式是否好奇呢? No.2 二重卷边工艺 二重卷边法通过两个具有不同沟槽形状的卷封滚轮,将预先翻边的罐身与法兰状的罐盖内侧周边相互卷曲、钩合、压紧,从而达到密封目的的方法,卷边过程如图所示:

    1.2K20编辑于 2022-01-20
  • 来自专栏数控编程社区

    密封垫片如何选型?

    垫片密封是过程工业装置中压力容器、过程设备、动力机器和连接管道等可拆连接处最主要的静密封型式。 垫片与垫片密封 垫片是一种夹持在两个独立的连接件(主要是指法兰)之间的材料或材料的组合,其作用是在预定的使用寿命内,保持两个连接件间的密封。 垫片必须能够密封结合面,并确保密封介质不渗透和不被腐蚀,能够承受得住温度和压力的作用。 非金属法兰就必须选择预紧力要求比较小的垫片,否则很可能会有在法兰上紧过程中,垫片还没有压紧而法兰已经压碎的情况出现(如图4)。 垫片的厚度与其型式、材料、直径、密封面的加工状况和密封介质等相关。对于大多数非金属板材垫片而言,薄的垫片抵抗应力松弛的能力也比较大。

    62130编辑于 2022-05-16
  • 来自专栏微言码道

    Java 8之后的新特性(九):密封与接口 Sealed Classes and Interfaces

    密封 Sealed Class就是你不可错过的一个特性。 从继承说起 Java是一门面向对象的语言,这个是我们众所周知的,而面向对象的语言的三大重要特性就是封装,继承与多态。 这就是密封与接口要解决的问题。 密封与接口 密封是这样一种概念,它在允许抽象与继承的基础之上,添加约束限制。 密封或接口,允许你对于可实现的或可继承的进行约束,以防止继承或实现被突破 还是以代码来展示更为直接。 密封 //使用sealed关键字表明这是一个密封 public abstract sealed class Week //使用permits关键字来约束允许的子类或实现 定义一个密封密封接口的原则是: • 使用sealed关键字来修饰class,表明这是一个密封 • 使用permits关键字来对可实现的或子类进行约束 记住,或接口,都可以使用sealed关键字

    1.5K30编辑于 2022-06-07
  • 来自专栏SpringBoot教程

    JDK8-JDK17中的新特性(var类型推断、模式匹配、Record、密封

    1.8 密封背景:在 Java 中如果想让一个不能被继承和修改,这时我们应该使用 final 关键字对进行修饰。 Java 15 尝试解决这个问题,引入了 sealed ,被 sealed 修饰的可以指定子类。这样这个就只能被指定的继承。 JDK15的预览特性:通过密封和接口来限制超的使用,密封和接口限制其它可能继承或实现它们的其它或接口。具体使用:使用修饰符sealed,可以将一个声明为密封密封使用保留关键字permits列出可以直接扩展(即extends)它的。 以前,为了解决空指针异常,Google在著名的Guava项目引入了Optional,通过检查空值的方式避免空指针异常。受到Google的启发,Optional已经成为Java 8库的一部分。

    4.1K11编辑于 2023-06-01
领券