天天看点

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

Kotlin编程相关知识点介绍:

  • Kotlin编程之使用Intellij IED和了解源文件(.kt)
  • Kotlin编程之类的介绍和使用
  • Kotlin编程之类的属性
  • Kotlin编程之方法
  • Kotlin编程之父类和继承父类
  • Kotlin编程之接口和实现接口
  • Kotlin编程之伴生对象,抽象类,密封类
  • Kotlin编程之嵌套类,内部类,匿名内部类
  • Kotlin编程之对象的表达式和声明
  • Kotlin编程之扩展方法

扩展属性

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

package com.xingen.kotlin.day2017527

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

/**
 * 属性扩展
 * 这里,给List类扩展一个lastIndex的属性,但是不会真的作为成员属性。
 */
val  <T> List<T>.lastIndex:Int get(){
    //等同于get=size-1,这里返回最后一个元素的角标
    return  this.size-
}
           

输出结果:

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",,)
    println(mutableList)
    //使用自定义的扩展函数
    mutableList.swap(,)
    println(mutableList)

}
           

输出结果:

[, , ]
[, , ]
           

可知:

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

导入方式如下:

  • 导入对应的包,这里是

    import com.xingen.kotlin.day2017527.*

  • 当然也可以导入具体的路径,包.扩展函数名,这里是

    import com.xingen.kotlin.day2017527.swap

扩展的好处

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