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类的字段有如上类似的赋值操作时要稍微留意下喽~

猜你喜欢

转载自blog.csdn.net/qq_38350635/article/details/126930383