Kotlin编程之扩展属性和扩展伴生对象

时间:2021-07-07 09:37:53

Kotlin编程相关知识点介绍


扩展属性


在Kotlin编程,对类的函数进行扩展外,也支持属性扩展。

package com.xingen.kotlin.day2017527

fun main(args: Array<String>) {
var list=listOf("1",2,"3")
println(list.lastIndex)
}

/**
* 属性扩展
* 这里,给List类扩展一个lastIndex的属性,但是不会真的作为成员属性。
*/

val <T> List<T>.lastIndex:Int get(){
//等同于get=size-1,这里返回最后一个元素的角标
return this.size-1
}

输出结果:

2

可知:

  • 扩展并不会真正给类添加了成员属性,因此也没有办法让扩展属性拥有一个备份字段.这也是为什么初始化函数不允许有扩展属性。
  • 扩展属性只能够通过明确提供 getter 和 setter方法来进行定义.

伴生对象的扩展


在Kotlin编程中,一个类定义了伴生对象,也可以给伴生对象的属性扩展和函数扩展。

package com.xingen.kotlin.day2017527

fun main(args: Array<String>) {

Day2017527.test()
}
/**
* 定义伴生对象
*/

class Day2017527{
companion object{
}
}
/**
* 伴随对象扩展:
* 这里扩展一个方法
*/

fun Day2017527.Companion.test(){
println("伴随对象的扩展")
}

输出结果:

伴随对象的扩展

可知:

  • 若是给伴生对象定义的属性扩展或者函数扩展,可以直接通过类名来调用。

扩展的作用域


在Test.kt中编写代码如下:

package com.xingen.kotlin.day2017527

/**
* 对函数进扩展:
* 在函数前面指定一个接受者,这里的接受者是MutabList<E>集合。
* 为它扩展一个swap函数
* 扩展函数的this指向接受者对象。
*
*/

fun <T> MutableList<T>.swap(x:Int,y:Int){
//利用一个中间变量,互换之指定位置的值。
val temp=this[x]
this[x]=this[y]
this[y]=temp
}

在Day2017527.kt中编写代码如下:

package com.xingen.kotlin.day2017527

//导入需要用到扩展函数所在的包
import com.xingen.kotlin.day2017527.*

/**
* Created by ${新根} on 2017/5/28 0028.
* 博客:http://blog.csdn.net/hexingen
*/


fun main(args: Array<String>) {
/**
* 调用MutablListOf类的扩展方法swap( )
*/

var mutableList=mutableListOf("1",2,3)
println(mutableList)
//使用自定义的扩展函数
mutableList.swap(0,2)
println(mutableList)

}

输出结果:

[1, 2, 3]
[3, 2, 1]

可知:
在一个源文件中,编写包级别的扩展函数,在另外一个源文件中可以进行使用。

导入方式如下:

  • 导入对应的包,这里是import com.xingen.kotlin.day2017527.*
  • 当然也可以导入具体的路径,包.扩展函数名,这里是import com.xingen.kotlin.day2017527.swap

扩展的好处

通过函数扩展,属性扩展,伴生对象扩展的接触,方面自定义一些常用的功能代码。这在java编程中,通常是放到util类中。在Kotlin编程,通过扩展可以实现工具类的作用。