Kotlin学习笔记之 9

作者: super_shanks | 来源:发表于2019-03-26 11:37 被阅读57次

9.Kotlin 数据类与密封类

  • 数据类

    在class前面加上data关键字,这个类就变成了数据类,会自动添加我们一般在java中需要添加的方法

    数据类不能继承,也不能被继承。

    数据类的主构造函数不能无参

    数据类的copy方法可以直接进行修改

     var s = Student("Tom", 23)
     var a = s.copy(age = 18)
    
  • 密封类

    又叫做密闭类,一般用来替代java中枚举类

    sealed class UiOp {
          object Show: UiOp()
          object Hide: UiOp()
      } 
      fun execute(view: View, op: UiOp) = when (op) {
          UiOp.Show -> view.visibility = View.VISIBLE
          UiOp.Hide -> view.visibility = View.GONE
      }
    

    实际上我们不一定要内部继承的方式,卸载外面也行,不要被这种形式拘泥。

    上面的例子就是我们定力了枚举展示和隐藏,然后通过when的方式,去操作View

    单单这个例子是看不出密闭类的优越性的,如果我们还需要对View进行移动的话,枚举就做不到了,但是密闭类可以。

    sealed class UiOp
      object Show: UiOp()
      object Hide: UiOp()
      class TranslateX(val px: Float): UiOp()
      class TranslateY(val px: Float): UiOp()
      
      fun execute(view: View, op: UiOp) = when (op) {
          UiOp.Show -> view.visibility = View.VISIBLE
          UiOp.Hide -> view.visibility = View.GONE
          // 这个 when 语句分支不仅告诉 view 要水平移动,还告诉 view 需要移动多少距离,这是枚举等 Java 传统思想不容易实现的
          //注意这里的is
          is UiOp.TranslateX -> view.translationX = op.px 
          UiOp.TranslateY() -> view.translationY = op.px
      }
    

    所以密闭类在我看来就是java枚举的拓展

    并且密闭类只能在一个文件中进行申明

    封闭类如果是class的话,用when匹配必须要加 is 或者 直接生成对象()

相关文章

网友评论

    本文标题:Kotlin学习笔记之 9

    本文链接:https://www.haomeiwen.com/subject/jncgvqtx.html