一、场景描述
在 Java 开发中,我们习惯性将一些通用的方法做成工具类,工具类的方法都是静态(static)方法,调用时直接通过类名进行调用,无需实例化类,使用非常方便,如下图所示。
public class DateUtils {
// 声明静态方法
public static String formatTime(String format) {
// ......
}
}
public static void main(String [] args) {
// 调用静态方法
DateUtils.formatTime("HH:mm:ss")
}
然而,在 Kotlin 中是没有 static 关键字的,也就是说无法使用 static 关键字声明 “静态方法”,那么在 Kotlin 中如何实现类似静态方法的效果呢?
二、在 Kotlin 中实现静态方法效果
在之前的章节,博主介绍过 Kotlin 单例的实现,看过的人都会发现获取单例对象的时候,就有类似静态方法的实现。没错,在 Kotlin 中实现静态方法效果,用的就是伴生对象(关于伴生对象相关知识参考 对象表达式与对象声明 中伴生对象相关章节)。在声明伴生对象时,如果不指定伴生对象的名称,将会默认使用类名作为伴生对象名称,在伴生对象内部声明需要调用的方法,即可实现类似于静态方法的效果。如下所示:
class DateUtils {
companion object {
const val DATE_FORMAT_YYYY_MM_DD : String = "yyyy/MM/dd"
const val DATE_FORMAT_HH_MM: String = "HH:mm"
/**
* 获取当前日期
* @param format 格式字符串,例如: yyyy/MM/dd,HH:mm等
*/
fun getCurrentDateTime(format: String) : String {
val dateFormat = SimpleDateFormat(format, Locale.getDefault())
return dateFormat.format(Date())
}
fun formatDate(year: Int, month: Int, dayOfMonth: Int, format: String) : String {
Calendar.getInstance().apply {
set(year, month, dayOfMonth)
return SimpleDateFormat(format, Locale.getDefault()).format(time)
}
}
}
}
// 通过伴生对象直接调用方法
DateUtils.getCurrentDateTime(DateUtils.DATE_FORMAT_YYYY_MM_DD)
需要注意的是,如果是在JVM环境,则需要在对外静态访问的方法中添加 @JvmStatic
注解,对外访问的静态变量(伴生常量)添加 @JvmField
注解,那么以上示例就要写成如下:
class DateUtils {
companion object {
@JvmStatic const val DATE_FORMAT_YYYY_MM_DD : String = "yyyy/MM/dd"
@JvmStatic const val DATE_FORMAT_HH_MM: String = "HH:mm"
/**
* 获取当前日期
* @param format 格式字符串,例如: yyyy/MM/dd,HH:mm等
*/
@JvmStatic
fun getCurrentDateTime(format: String) : String {
val dateFormat = SimpleDateFormat(format, Locale.getDefault())
return dateFormat.format(Date())
}
@JvmStatic
fun formatDate(year: Int, month: Int, dayOfMonth: Int, format: String) : String {
Calendar.getInstance().apply {
set(year, month, dayOfMonth)
return SimpleDateFormat(format, Locale.getDefault()).format(time)
}
}
}
}
// 通过伴生对象直接调用方法
DateUtils.getCurrentDateTime(DateUtils.DATE_FORMAT_YYYY_MM_DD)
三、编后语
其实即使是工具类,完全也可以通过实例化对象之后调用对应的方法,但是实现类似静态方法的效果,可以更加简洁。