【问题标题】:Can a class object created "on the fly" in Kotlin have a constructor?在 Kotlin 中“动态”创建的类对象可以有构造函数吗?
【发布时间】:2017-10-10 18:07:15
【问题描述】:

我在 Kotlin 中创建了一个这样的对象并将其传递给我的方法:

    val myObject = object {

        @SerializedName("fieldOne")
        val fieldOne = myFieldOne

        @SerializedName("fieldTwo")
        val fieldTwo = myFieldTwo

        @SerializedName("fieldThree")
        val fieldThree = myFieldThree
    }

    dbManager.save(myObject) // this works fine

然而,Android Studio 抱怨并说:

从未使用过属性“fieldOne”

我知道我可以通过 lint 选项删除此警告,但希望找到一种“本机”方法来消除此警告。

【问题讨论】:

  • 我认为您应该更改问题的标题,因为在标题和正文中,您提出了两个完全不同的问题。

标签: android kotlin lint


【解决方案1】:

object 的使用是通过反射完成的。实际类定义了一个构造函数,其参数myFieldOnemyFieldThree

为了代码的完整性,您应该考虑使用 数据类KotlinJava 一样是静态类型的,您应该尽可能地利用它。下一步就是去掉你不需要做的任何反射。

【讨论】:

  • 感谢@tynn,数据类似乎是最合适的选择。
【解决方案2】:

我不知道您所说的“摆脱它的原生方式”是什么意思,但有一个注释:

val myObject = @Suppress("unused") object {
    @SerializedName("fieldOne")
    val fieldOne = myFieldOne
    // ...
}

当然,您可以创建一个数据类,但在某些用例中,匿名单例 (object {}) 是更好的选择,然后您将需要此注释来告诉静态代码分析这是需要的而不是不需要的搞错了。

【讨论】:

  • 是的,@Suppress("unused") 是我不完全相信使用的 lint optins 的一部分。
  • @lalongooo 好的,我明白了。但正如我的第二段所暗示的那样,在某些情况下,您将不得不使用对象{},从而使用符号。我不会改变我的代码设计,只是因为我不喜欢可以忽略的 Lint 警告。 Lint 只能知道这么多,它无法猜测你的意图,这就是为什么你使用注释“告诉它”不再用你思考过的事情来打扰你。
  • @lalongooo 所以如果你声明一个数据类并且只使用它一次,我宁愿使用对象{}...如果你使用数据类两次,那就用它吧
猜你喜欢
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 2010-09-20
相关资源
最近更新 更多