Kotlin 如何创建静态方法

Kotlin 如何创建静态方法

有三种方法可以实现类似Java的静态方法,分别是:对象声明、扩展函数、伴生对象。

对象声明

对象声明非常好理解,就是用object关键字声明了一个对象,对象里面可以有变量也可以有方法,
即我们在定义类的时候,将关键字class改成object来修饰,那么该类名下的方法都是静态方法了。

/**
 * Created by ngudream on 17-7-24.
 * 类内全部是静态方法,dp和px之间的换算工具类
 */
object DensityUtil {

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    fun dip2px(context: Context, dpValue: Float): Int {
        val scale = context.resources.displayMetrics.density
        return (dpValue * scale + 0.5f).toInt()
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    fun px2dip(context: Context, pxValue: Float): Int {
        val scale = context.resources.displayMetrics.density
        return (pxValue / scale + 0.5f).toInt()
    }

}

扩展函数

如果你要写一个没有实例类就可以调用的方法,但需要访问到类内部(比如说一个工厂方法),你可以把它写成它所在类的一个成员(you can write it as a member of an object declaration inside that class)。

  • 扩展函数是静态解析的,并未对原类添加函数或属性,对类本身没有任何影响。
  • 扩展属性允许定义在类或者kotlin文件中,不允许定义在函数中。

比如我们想让Activity异步加载图片,Activity中添加新的方法,Java的写法是:

public static void setImageAsync(ImageView iv, String url) {
  new Thread(new Runnable() {
          @Override
          public void run() {
              //异步获取url数据,然后设置到imageview中
          }
      }).start();
  }

在Kotlin中使用扩展函数的话,写法可以这样写,我们可以在任何地方(如一个utils文件中)声明这个函数,在我们的Activity对象中将它作为普通方法来使用:

  • Activity:表示函数的接收者,也就是函数扩展的对象
  • . :扩展函数修饰符
  • setImageAsync:扩展函数的名称
fun Activity.setImageAsync(url: String?) {
        Thread(Runnable {
            //异步获取url数据,然后设置到imageview中
        }).start()
    }


在activity中调用

override fun onCreate(savedInstanceState: Bundle?) {
     super<BaseActivity>.onCreate(savedInstanceState)

     setImageAsync("url")
}

伴生对象

相比扩展函数,更高效的方法是,你可以在你的类中声明一个伴随对象,这样你就可以像 java/c# 那样把它当做静态方法调用,只需要它的类名做一个识别就好了。

大家在使用Java的时不知有没有注意到,Java类中的静态变量及方法是在什么时候初始化的?是在静态方法第一次调用时还是在相应的Java类被加载时?答案是在Java类被加载时(也就是说如果你调用过Java类中的实例变量及方法后,即使你没有使用静态变量及方法,静态变量已经初始化了)。这种现象用伴生来描述是不是很贴切。伴生对象所在的类被加载,伴生对象被初始化,与Java静态成员一样。

Kotlin的class并不支持static变量,所以需要使用companion object来声明static变量,编译器会自动生成一个companion内部类。

class Books(var name: String, val page: Int) {
    companion object ComBooks{
        val a : Int = 10
        fun doNote() {
            println("do note")
        }
    }
}

fun main(args: Array<String>) {
    Books.ComBooks.doNote()//第一种调用方法

    println("Book.a = ${Books.ComBooks.a}")

    println("-------------")

    Books.doNote()//第二种调用方法

}

// Log
do note
Book.a = 10
-------------
do note

如上代码可知,伴生对象可以实现静态调用,通过类名.属性名或者类名.方法名进行调用。

文章目录
  1. 1. Kotlin 如何创建静态方法
    1. 1.1. 对象声明
    2. 1.2. 扩展函数
    3. 1.3. 伴生对象
|