【问题标题】:How to generate data class from class instance如何从类实例生成数据类
【发布时间】:2021-08-06 04:39:33
【问题描述】:

我在 JSON 文件中有一些配置值,我想通过 gson 将其解析为数据类。我想根据创建的数据类生成一个新类,其中值是最终的。 这一切都应该在我的 CI-Pipeline 期间发生,然后应该在我的应用程序运行时使用生成的类。

简单的例子来说明:

我有这个数据类

data class MyDataClass(val name:String, val age:Int)

并通过解析(gson)创建这样的实例

MyDataClass("john", 42)

有没有办法基于 MyDataClass 的新实例创建(数据)类,以便创建类似的东西?

class MyDataClassFinal{
  val name = "john"
  val age = 42
}

【问题讨论】:

  • 您的初始数据类已经是“最终的”,它的属性也是如此。这是 Kotlin 中的默认设置。您到底在寻找什么不存在的东西?

标签: kotlin code-generation data-class


【解决方案1】:

使用.copy() 并仅修改您需要的参数。例如:

val joe = MyDataClass(“Joe”, 42)
val mary = joe.copy(name = “Mary”) // age is 42

【讨论】:

  • 我更新了我的问题,也许不,我想说的更清楚:)
  • 您想定义一个与 MyDataClass 不同的新类吗?不确定,因为你给了它相同的名称并且它具有相同的属性,所以我不知道为什么它应该是一个不同的类。
【解决方案2】:

我在 json 文件中有一些配置值,我想通过 gson 将其解析为数据类。我想根据创建的数据类生成一个新类,其中值是最终的。

你在这里无事可做。正如您所描述的,数据类是最终的。它不是open,所以类是最终的,字段是vals,并且只能通过构造函数设置,所以它们不能更改,所以它们也是最终的。

您可以通过搜索“Actions”,寻找Kotlin Bytecode,然后点击Decompile 来查看Java 源代码,从而看到类的Java 等效项。它看起来像这样:

@Metadata(
   mv = {1, 1, 18},
   bv = {1, 0, 3},
   k = 1,
   d1 = {"\u0000 \n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010\b\n\u0002\b\t\n\u0002\u0010\u000b\n\u0002\b\u0004\b\u0086\b\u0018\u00002\u00020\u0001B\u0015\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006J\t\u0010\u000b\u001a\u00020\u0003HÆ\u0003J\t\u0010\f\u001a\u00020\u0005HÆ\u0003J\u001d\u0010\r\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\b\b\u0002\u0010\u0004\u001a\u00020\u0005HÆ\u0001J\u0013\u0010\u000e\u001a\u00020\u000f2\b\u0010\u0010\u001a\u0004\u0018\u00010\u0001HÖ\u0003J\t\u0010\u0011\u001a\u00020\u0005HÖ\u0001J\t\u0010\u0012\u001a\u00020\u0003HÖ\u0001R\u0011\u0010\u0004\u001a\u00020\u0005¢\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\t\u0010\n¨\u0006\u0013"},
   d2 = {"Lcore/lib/extensions/MyDataClass;", "", "name", "", "age", "", "(Ljava/lang/String;I)V", "getAge", "()I", "getName", "()Ljava/lang/String;", "component1", "component2", "copy", "equals", "", "other", "hashCode", "toString", "treking-android.dominicore-android"}
)
public final class MyDataClass {
   @NotNull
   private final String name;
   private final int age;

   @NotNull
   public final String getName() {
      return this.name;
   }

   public final int getAge() {
      return this.age;
   }

   public MyDataClass(@NotNull String name, int age) {
      Intrinsics.checkParameterIsNotNull(name, "name");
      super();
      this.name = name;
      this.age = age;
   }

   @NotNull
   public final String component1() {
      return this.name;
   }

   public final int component2() {
      return this.age;
   }

   @NotNull
   public final MyDataClass copy(@NotNull String name, int age) {
      Intrinsics.checkParameterIsNotNull(name, "name");
      return new MyDataClass(name, age);
   }

   // $FF: synthetic method
   public static MyDataClass copy$default(MyDataClass var0, String var1, int var2, int var3, Object var4) {
      if ((var3 & 1) != 0) {
         var1 = var0.name;
      }

      if ((var3 & 2) != 0) {
         var2 = var0.age;
      }

      return var0.copy(var1, var2);
   }

   @NotNull
   public String toString() {
      return "MyDataClass(name=" + this.name + ", age=" + this.age + ")";
   }

   public int hashCode() {
      String var10000 = this.name;
      return (var10000 != null ? var10000.hashCode() : 0) * 31 + this.age;
   }

   public boolean equals(@Nullable Object var1) {
      if (this != var1) {
         if (var1 instanceof MyDataClass) {
            MyDataClass var2 = (MyDataClass)var1;
            if (Intrinsics.areEqual(this.name, var2.name) && this.age == var2.age) {
               return true;
            }
         }

         return false;
      } else {
         return true;
      }
   }
}

如您所见,类、字段及其访问器都是final

【讨论】:

  • 感谢您的回复。不,我不寻找默认参数。我想根据实例中的值创建一个完整的新类(也是一个新的类文件)。
  • 从具有相同数据的现有类文件创建新类文件有什么用...?
  • 我更新了我的问题。生成和使用处于应用程序的不同阶段。生成通过 CI-Builds 运行,并且在运行应用程序时使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多