Kotlin#object#get踩坑

今天在项目中碰到了kotlin字段赋值的坑,这里简单记录下,也希望对大家也有帮助~

简单模拟下代码是这样的:

class MainActivity : AppCompatActivity() {
    companion object {
        val currencyCode: String
            get() = when (Helper.region) {
                "USD" -> "USD"
                "CAD" -> "CAD"
                else -> {
                    "CAD"
                }
            }

        val test = when (Helper.region) {
            "USD" -> "USD"
            "CAD" -> "CAD"
            else -> {
                "CAD"
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var count = 1
        btn.setOnClickListener {
            if (count%2==0){
                Helper.region = "USD"
                Log.d("MAIN","currencyCode:${currencyCode}")
               // println("test:${test}")值一直为Helper.region的初始值
            }else{
                Helper.region = "CAD"
                Log.d("MAIN","currencyCode:$currencyCode")
               // println("test:${test}") //值一直为Helper.region的初始值
            }
            count++
        }
    }
}

companion object中定义了两个字段,字段的值是根据Helper.region这个变量的值动态更改的,然而在获取二者字段的值时确是不同的。test的值始终为Helper.region变量的默认值。

猜想:test生成的java代码code的获取可能是写死的常量?

带着疑问看了下编译后的java文件(tools->kotlin->show kotlin bytes->Decompile):

public final class MainActivity extends AppCompatActivity {
   @NotNull
   private static final String test; //1、为test定义了个成员变量
   @NotNull
   public static final MainActivity.Companion Companion;
   
   static {
      String var10000;
      label19: {
         Companion = new MainActivity.Companion((DefaultConstructorMarker)null);
         String var0 = Helper.INSTANCE.getRegion();
         switch(var0.hashCode()) {
         case 66470:
            if (var0.equals("CAD")) {//4、var10000 由于我们默认设置的为CAD会走这里
               var10000 = "CAD";//5、赋值给var10000
               break label19; //6、重点 重点 重点 -> 退出label19快。 
            }
            break;
         case 84326:
            if (var0.equals("USD")) {
               var10000 = "USD";
               break label19;
            }
         }

         var10000 = "CAD"; 
      }

      test = var10000; // 3、test 字段的赋值,取的var10000
   }

   public static final class Companion {
      @NotNull
      public final String getCurrencyCode() {
         String var1 = Helper.INSTANCE.getRegion();
         String var10000;
         switch(var1.hashCode()) {
         case 66470:
            if (var1.equals("CAD")) {
               var10000 = "CAD";
               return var10000;
            }
            break;
         case 84326:
            if (var1.equals("USD")) {
               var10000 = "USD";
               return var10000;
            }
         }

         var10000 = "CAD";
         return var10000;
      }

      @NotNull
      public final String getTest() { //2、为test 字段生成了个getTest方法
         return MainActivity.test;
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }

   protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      this.setContentView(1300000);
   }

...
}

简单分析下code值的获取,如上getCurrencyCode的逻辑也是类似了~

可见二者的kotlin代码被编译成的java代码是不一样的,因此有无get的区别也就出来了。

哈哈哈下次再遇到companion object或者 object类的字段有如上类似的赋值操作时要稍微留意下喽~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值