kotlin中几个特殊类

2024-03-03  本文已影响0人  爱你为你做饭
  1. 数据类:java的数据类和普通类一样,通常声明属性及其对应的set和getapi,同时封装和当前数据类相关的逻辑方法,kotlin的数据类和java类不一样,语法上需要使用关键字data声明,其他要点整理如下:
    • 针对kotlin的数据类,kotlin会根据主构造函数中的所有属性自动生成下面几个函数:


      自动生成函数

      备注:
      * 前面三个函数是对象的比对,hash码,和属性的输出,kotlin的不同点是属性的输出会自动将主构造函数中的属性输出不需要重写,同时对象的比对也仅是比对主构造函数中的属性。
      * kotlin会为数据类的主构造函数中的每一个属性创建一个函数即:componentN(): n是主构造函数中声明的属性的顺序。
      * copy函数用于对象的复制,复制对象的过程中可以修改主构造函数中的属性的值。
      * 自动生成的几个函数的数据类中的属性需要满足的必要条件是:


      数据类
      * 针对比对等三个函数,若数据类中有实现或者父类中有这final的实现则不会自动生成。
      * 如果超类存在 open 的 .componentN() 函数, 并且返回一个兼容的数据类型, 那么子类中对应的函数会自动生成, 并覆盖超类中的函数. 如果超类中的函数签名不一致, 或者是 final 的, 导致子类无法覆盖, 则会报告编译错误.

      * 不允许对 .componentN() 和 .copy() 函数提供明确的实现(译注, 这些函数必须由编译器自动生成).

  1. 封闭类和封闭接口:封闭类和封闭接口是限制了类和接口的实现类(子类)的实现位置,即将其子类的实现位置控制在封闭类的声明包和模块中,比如创建异常模块非常试用封闭类或者封闭接口:error顶层类或者接口,其子类都在这一模块中,其他模块不能够对其进行实现,这个是策略模式特别是编译前穷尽策略模式的最恰当实现。
    • 由于封闭类或者接口都在统一模块中实现,所以在编译阶段其子类实现就能够确定。
    • 封闭类是抽象类,可以声明抽象函数和抽象属性
    • 封闭类在语法上使用关键字:sealed进行声明
    • 封闭类的构造函数的权限是protected和private
    • 封闭类和接口的直接子类必须定义在同一个包之内. 可以是顶级位置, 也可以嵌套在任意多的其他有名称的类, 有名称的接口, 或有名称的对象之内. 子类可以设置为任意的 可见度, 只要它们符合 Kotlin 中通常的类继承规则.
    • 这些限制不适用于非直接子类. 如果封闭的类一个直接子类没有标记为封闭, 那么它可以按照其修饰符允许的方式任意扩展:
    • 封闭类的主要好处是体现在 when 表达式中的使用场景. 如果能够确保 when 的分支已经覆盖了所有可能的情况, 你可以不必添加 else 分支:
      封闭类
  2. 嵌套类(接口):和java一致,kotlin同样支持类中嵌套类,接口中嵌套接口,类中嵌套接口,接口嵌套类,嵌套即在类中声明另外一个类。使用如下:


    类嵌套
    接口嵌套
  3. 内部类:
    • 内部类是嵌套类的实现,即在嵌套类的实现中使用关键字inner 声明,此类为外部类的一个内部类,此时内类中可以访问外类的属性及其函数。


      内部类
    • 关于kotlin中的this,可以参考后续的学习整理,即属性和函数中会描述这个,kotlin支持this声明标签进而标识this指向那一个对象。
    • 匿名内部类,内部类的一种简化实现,具体语法参考下面图片:


      匿名内部类
      单实现函数接口的lambda表达式实现
  4. 枚举类:
    • java枚举:针对逻辑中的多条件场景,特别是ifelse和switch中 的12345等多场景下,java提供了枚举类,通过枚举中针对每一个数字声明一个对象的方式规范且明了的优化当前场景。下面简单整理一下java枚举中的要点:详情可以参考下面的文章:
      • 枚举借助于enum关键字,没有添加任何方法的前提下每一个枚举值都是从0开始
      • 枚举默认添加了下面几个方法:values(),name(),ordinal(),getDeclaringClass(),equals()。
      • 枚举继承与系统类Enum所以枚举类不能够再继承其他类,但是可以实现其他接口。
      • 枚举内部可以声明属性,且可以添加方法:普通方法,静态方法,抽象方法,构造方法,实现接口可以在枚举中实现方法,也可以在枚举的每一个枚举值中实现方法。
    • kotlin枚举类:和java一致,kotlin也提供了枚举的支持。
      • 普通枚举的实现kotlin和java一致,且kotlin可以通过主构造函数为枚举值赋值。kotlin中枚举中的每一个常数被称为枚举常数。
      • 和java一致,kotlin的每一个枚举常数都可以声明一个匿名类,在匿名类中可以声明函数,且函数也可以实现枚举基类声明的抽象函数等。
      • 语法上,枚举常数之间使用,隔开,但是枚举中若声明了对应的函数那么枚举常量和函数之间使用;隔开。
      • kotlin:枚举可以实现接口不能再继承其他的类。
      • 和java枚举系统提供方法一样,kotlin也提供了常数:用来获取枚举常量及其枚举常量对应的值。


        枚举系统常数
  5. 内联值类:?????????? 没学明白,后续搞明白再来填补。

参考文章:
一文了解java枚举

上一篇 下一篇

猜你喜欢

热点阅读