Skip to content

Latest commit

 

History

History
110 lines (71 loc) · 3.77 KB

数据类和密封类.md

File metadata and controls

110 lines (71 loc) · 3.77 KB

数据类和密封类

数据类和密封类

扩展的作用域

当中没有讲到 接口、可见性修饰符、扩展方面的知识,因为这些知识对于作为已经撸了一两年的java的人来说,看这文档都很容易理解的 ,有点需要强调,文档中的一句话: 大多数时候我们在顶层定义扩展,即直接在包里
这里就不说废话,直接举例看kotlin的源码来说。这个.kt文件在Kotlin包下面,他写了很多的扩展函数,没有定义类。

源码

  • kotlin源码中有很多这样的文件。我们自己在   写代码时也可以这样,比如一些工具呀,之前不是创建的工具类吗,其实可以不用创建工具类。还是看一个例子吧

package com.asdf.myapplication
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
//导包
import com.asdf.myapplication.test.isFilexists
import com.asdf.myapplication.test.toast
class Main2Activity : AppCompatActivity() {
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main2)
       var c =  "youxin".isFilexists() 
       var d =  "youxin".toast(this).isFilexists()//是不是用起来很方便 怎么去使用就看个人了,
       Log.e("youxin", c.toString())
       Log.e("youxin", d.toString())
   }
}


//下面就是我创建的一个工具文件
package com.asdf.myapplication.test
import android.content.Context
import android.widget.Toast
import java.io.File
/**
* Created by Administrator on 2017/9/19 0019.
*/
fun String.isFilexists(): Boolean {
   val dir = File(this)
   return dir.exists()
}
//这个 this 关键字在扩展函数内部对应到接收者对象(传过来的在点符号前的对象)这个应该不难理解吧。
fun String.toast(context: Context):String {
   Toast.makeText(context,this,Toast.LENGTH_LONG).show()
   return this;
}





数据类

  • 这需要提一下的就是Android studio的一个插件叫JsonToKotlinClass 可以更具json转换成kotlin对应的data数据类,这插件和之前java里面的GsonFormat使用   方式有点微微的差别。
  • 注意点:
//这么写也没有错,但是我觉得还是不要这样做
data class Che(
        var content_id: Int = 1,
        var title: String
) {
    var name: String = "adsf"
}

//下面看看 编译器编译这个之后的代码
public final data class Che public constructor(content_id: kotlin.Int /* = compiled code */, title: kotlin.String) {
    public final var content_id: kotlin.Int /* compiled code */

    public final var name: kotlin.String /* compiled code */

    public final var title: kotlin.String /* compiled code */

    public final operator fun component1(): kotlin.Int { /* compiled code */ }

    public final operator fun component2(): kotlin.String { /* compiled code */ }
}
// 其中的component只有两个 ,另外使用copy函数的时候name也会不在其中,所以我们还是按照标准写。至于这样写会不会有什么其他的用于,就不知道了。大家
//如果发现了 可以告知下,相互学习

  • 标准数据类,标准库提供了 Pair 和 Triple。这两个标注库太牛逼了,我们不能停留在简单的用法上面,它更好,更帅的用法,如何去使用后面会讲到。

密封类

  • 密封类
  • 枚举类
  • 对于密封类可以理解为高级的枚举类,是枚举类的扩展。如果说你的枚举需要携带数据,这个密封类觉得完全符合你的要求