在 kotlin class 中访问字段并忽略 getter
Access field in kotlin class and ignore getter
考虑java中的这个class(数据不是私有的或public):
public class Poo {
String data = null;
public String getData() {
if (data == null)
return "";
else
return data.substring(0, 4);
}
public void setData(String data) {
this.data = data;
}
public String getDataPart2() {
if (data == null)
return "";
return data.substring(4);
}
}
我将这个 class 转换为 kotlin
class Poo1 {
var data: String? = null
get() = field?.substring(4) ?: ""
val dataPart2: String
get() = data?.substring(4) ?: ""
}
反编译后的代码是这样的:
@NotNull
public final String getDataPart2() {
String var10000 = this.getData();
if (var10000 != null) {
String var1 = var10000;
byte var2 = 4;
boolean var3 = false;
if (var1 == null) {
throw new TypeCastException("null cannot be cast to non-null type java.lang.String");
}
var10000 = var1.substring(var2);
Intrinsics.checkExpressionValueIsNotNull(var10000, "(this as java.lang.String).substring(startIndex)");
if (var10000 != null) {
return var10000;
}
}
var10000 = "";
return var10000;
}
在 kotlin class dataPart2 调用数据 getter(检查反编译代码中的第 2 行),但我需要访问数据实际值而不是 getter,在 kotlin 中是否可能访问字段而不调用 getter?
我不想更改 getter 或方法名称。
不,这不可能。我强烈建议更改class的设计:setter设置了完整的数据,而getter只获取了它的第一部分,非常令人惊讶,因此错误来源。
但是无论如何,如果你想保留你在 Kotlin 中的内容,你可以使用这个:
class Poo {
private var completeData: String? = null
var data: String
get() = completeData?.substring(0, 4) ?: ""
set(value) { completeData = value }
val dataPart2: String
get() = completeData?.substring(4) ?: ""
}
考虑java中的这个class(数据不是私有的或public):
public class Poo {
String data = null;
public String getData() {
if (data == null)
return "";
else
return data.substring(0, 4);
}
public void setData(String data) {
this.data = data;
}
public String getDataPart2() {
if (data == null)
return "";
return data.substring(4);
}
}
我将这个 class 转换为 kotlin
class Poo1 {
var data: String? = null
get() = field?.substring(4) ?: ""
val dataPart2: String
get() = data?.substring(4) ?: ""
}
反编译后的代码是这样的:
@NotNull
public final String getDataPart2() {
String var10000 = this.getData();
if (var10000 != null) {
String var1 = var10000;
byte var2 = 4;
boolean var3 = false;
if (var1 == null) {
throw new TypeCastException("null cannot be cast to non-null type java.lang.String");
}
var10000 = var1.substring(var2);
Intrinsics.checkExpressionValueIsNotNull(var10000, "(this as java.lang.String).substring(startIndex)");
if (var10000 != null) {
return var10000;
}
}
var10000 = "";
return var10000;
}
在 kotlin class dataPart2 调用数据 getter(检查反编译代码中的第 2 行),但我需要访问数据实际值而不是 getter,在 kotlin 中是否可能访问字段而不调用 getter? 我不想更改 getter 或方法名称。
不,这不可能。我强烈建议更改class的设计:setter设置了完整的数据,而getter只获取了它的第一部分,非常令人惊讶,因此错误来源。
但是无论如何,如果你想保留你在 Kotlin 中的内容,你可以使用这个:
class Poo {
private var completeData: String? = null
var data: String
get() = completeData?.substring(0, 4) ?: ""
set(value) { completeData = value }
val dataPart2: String
get() = completeData?.substring(4) ?: ""
}