【问题标题】:Access field in kotlin class and ignore getterkotlin 类中的访问字段并忽略 getter
【发布时间】:2020-01-18 14:50:50
【问题描述】:

考虑java中的这个类(数据不是私有的或公共的):

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);
    }
}

我把这个类转换成 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 类 dataPart2 中调用数据 getter(检查反编译代码中的第 2 行),但我需要访问数据实际值而不是 getter,在 kotlin 中是否可以访问字段而不调用 getter? 我不想更改 getter 或方法名称。

【问题讨论】:

    标签: java kotlin encapsulation


    【解决方案1】:

    不,这是不可能的。我强烈建议改变类的设计:setter 设置完整的数据,而 getter 只获取它的第一部分,这使得它非常令人惊讶,因此成为 bug 的来源。

    但无论如何,如果你想保留 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) ?: ""
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多