Kotlin 中实现静态方法效果

一、场景描述

    在 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)

三、编后语

    其实即使是工具类,完全也可以通过实例化对象之后调用对应的方法,但是实现类似静态方法的效果,可以更加简洁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值