@JvmStatic 和 @JvmField 在kotlin中的使用

这是关于 Java 静态方法和静态变量的一段代码:

  1. public class TestStatic {
  2.     private int otherField = 0;
  3.     public static final BigInteger BIG_INTEGER = BigInteger.ONE;
  4.     public static void method() {
  5.         System.out.println("call method");
  6.     }
  7. }
     

我们把它转换成 Kotlin 代码,会得到这样的结果:

  1. class TestStatic {
  2.     private val otherField = 0
  3.     companion object {
  4.         val BIG_INTEGER = BigInteger.ONE
  5.         fun method() {
  6.             println("call method")
  7.         }
  8.     }
  9. }
     


静态方法和静态变量会被放在 companion object 当中,成为伴生方法和伴生常量。而这时候,会发现在 Java 中调用它们的方式会不一样,如下:

 
  1. public static void main(String[] args) {

  2.     TestStatic.Companion.method();

  3.     BigInteger bigInteger = TestStatic.Companion.getBIG_INTEGER();

  4. }



如果要使转换后的 Kotlin 代码在 Java 上调用起来和以前的习惯一样,则需要分别使用 @JvmStatic 和 @JvmField 注解,才能使它们暴露为静态方法或静态字段,如下:

 
  1.     @JvmField val BIG_INTEGER = BigInteger.ONE

  2.  
  3.     @JvmStatic fun method() {

  4.         println("call method")

  5.     }


这样 Java 对 Kotlin 的调用习惯就和以前一样了:

 
  1. public static void main(String[] args) {

  2.     TestStatic.method();

  3.     BigInteger bigInteger = TestStatic.BIG_INTEGER;

  4. }



关于这一点,在《Android Kotlin 指南》的文档中有提到,分别如下:

伴生函数:

在 “companion object” 中的公共函数必须用使用 @JvmStatic 注解才能暴露为静态方法。

如果没有这个注解,这些函数仅可用作静态 Companion 字段上的实例方法。

伴生常量:

在 companion object 中的公共、非 const 的属性 实际上为常量 必须用 @JvmField 注解才能暴露为静态字段。

如果没有这个注解,这些属性只能作为静态 Companion 字段中奇怪命名的 ‘getters’ 实例。而只使用 @JvmStatic 而不是 @JvmField 的话,会将奇怪命名的 ‘getters’ 移到类的静态方法中,但仍然是不正确的。

 

 
  1. @JvmField消除了变量的getter与setter方法

  2. @JvmField修饰的变量不能是private属性的

  3. @JvmStatic只能在object类或者伴生对象companion object中使用,而@JvmField没有这些限制

  4. @JvmStatic一般用于修饰方法,使方法变成真正的静态方法;如果修饰变量不会消除变量的getter与setter方法,但会使getter与setter方法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值