【问题标题】:How to declare several properties on one line如何在一行上声明多个属性
【发布时间】:2016-01-27 11:39:07
【问题描述】:

我正在开发一个具有多个lateinit 属性的类。我认为像这样在单独的行上声明它们太冗长了:

lateinit var a: String 
lateinit var b: String

所以我想像这样在一行上声明它们:

lateinit var b, c: String // error: Property getter or setter expected

但我收到错误 Property getter or setter expected。有没有办法在 Kotlin 的一行中声明多个属性?

【问题讨论】:

标签: kotlin


【解决方案1】:

不,没有办法做到这一点。许多 Java 样式指南不赞成在同一行声明多个属性,因此我们没有在 Kotlin 中实现对它的支持。

【讨论】:

  • 以后有没有可能实现?
  • 我们目前没有这样的计划。
  • 嗯,这可能是个人喜好,但我宁愿将 x,y,z 分配在一行中,而不是添加三行新代码。
  • @yole 为什么不被人接受。?你能说出它被认为是坏的任何例子吗?为什么。考虑到 kotlin 完全是为了消除样板代码,如果在 kotlin 中也允许它,它将减少冗余代码!
  • “许多 Java 风格指南不赞成在同一行声明多个属性” - 需要引用。由于 Java 没有与 Kotlin 相同意义上的“属性”,因此澄清这意味着什么会有所帮助。也许您指的是字段?
【解决方案2】:

看语法这是不可能的:

property (used by memberDeclaration, declaration, toplevelObject)
  : modifiers ("val" | "var")
      typeParameters? (type "." | annotations)?
      (multipleVariableDeclarations | variableDeclarationEntry)
      typeConstraints
      ("by" | "=" expression SEMI?)?
      (getter? setter? | setter? getter?) SEMI?
  ;

您只能使用以下方式进行破坏性声明:

val (name, age) = person

【讨论】:

    【解决方案3】:

    您可以使用 kotlin 的解构声明,但它不适用于 lateinit 前缀。

    var (a, b, c, d) = listOf("fly", 23, "slow", 28)
    println("$a $b $c $d")
    

    这是一种解决方法,会创建不必要的列表初始化,但它可以完成工作。

    此外,您将无法自己定义变量类型,但类型推断在使用解构声明时会自动完成。

    【讨论】:

      【解决方案4】:

      如果你想用相同的值初始化多个字段,你可以这样做:

      val (x, y, z) = List(3) { 1 }

      val (x, y, z) = List(3) { "Hello" }

      等等。

      【讨论】:

        猜你喜欢
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多