当前位置: 首页 > 知识库问答 >
问题:

访问kotlin类中的字段并忽略getter

陶锋
2023-03-14

考虑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或方法名称。

共有1个答案

王渊
2023-03-14

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

但是无论如何,如果你想保持静态编程语言,你可以使用这个:

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切换到Kotlin。但我有很多遗留代码和第三方库。我看到,Java类中经常存在没有getter和setter的公共字段,这些字段必须从其他类访问。如果没有Kotlin代码中的getter,我如何访问Java类的公共字段?

  • 问题内容: 我有一些必须序列化为JSON的数据。我正在使用JSON.NET。我的代码结构与此类似: 问题是,我的JSON输出需要具有ON OR 或ON- 取决于所使用的字段(即不为null)。默认情况下,我的JSON如下所示: 我知道我可以使用,但这给了我如下所示的JSON: 我需要的是: 有没有简单的方法可以做到这一点? 问题答案: 是的,您需要使用。 但是由于结构是值类型,因此您需要将Fiel

  • 我需要一些使用MapStruct映射嵌套POJO的帮助。我需要跳过/删除目标类中所有子类的特定字段。 例如,以下是我的目标POJO 所有这些子类——,,。。。包含一个字段“”,我想在映射时忽略它。这种结构使得这些类不共享包含此字段的公共基类——“”。 我创建的映射器如下所示: 这工作。 然而,当中的子类数量很大时,它会变得很乏味。我需要明确指定每个类。 有没有人能告诉我,这是否可以用一种更通用的方

  • 我在通过MapStruct映射字段时遇到问题。 我有两门课。第一个域类“事件”,例如带有字段 第二类是“EventForm”。EventForm具有字段: 当我想更新现有事件时,会发生以下情况:1)我通过Id从数据库中获取现有事件 <代码>事件事件=事件服务。获取(id) 事件id=10000,lastUpdate=11213123123; 2) 我正在将字段从表单映射到域类 <代码>事件=映射器

  • 问题内容: 当我发送此请求时: 我的休息服务: 我期望得到一个例外,因为: 我的域模型中没有invalidField。 日期格式无效。 但是实际上我得到的测试对象具有空值。我的dmain模型是: 我认为这不是有效的行为。我该如何解决? 感谢帮助。 解: 正如Blaise Doughan所说,需要扩展MOXy的MOXyJsonProvider并重写preReadFrom方法以设置自定义javax.x