今天在项目中碰到了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类的字段有如上类似的赋值操作时要稍微留意下喽~