如何在一行上声明多个属性

net*_*men 31 kotlin

我正在开发一个具有lateinit一种类型的几个属性的类.我认为将它们分别在这样的单独行上声明它是非常冗长的:

lateinit var a: String 
lateinit var b: String
Run Code Online (Sandbox Code Playgroud)

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

lateinit var b, c: String // error: Property getter or setter expected
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误Property getter or setter expected.有没有办法在Kotlin的一行声明几个属性?

yol*_*ole 48

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

  • 嗯,也许这是个人喜好,但我宁愿一行分配x,y,z而不是三行新代码。 (5认同)
  • @yole 到底为什么它不受欢迎。?您能举出任何被认为不好的例子以及原因吗?考虑到 kotlin 的核心就是消除样板代码,如果 kotlin 也允许这样做的话,将会减少冗余代码! (3认同)
  • 我们目前没有这样的计划。 (2认同)
  • “许多 Java 风格指南都不赞成在同一行声明多个属性” - 需要引用。由于 Java 没有与 Kotlin 相同意义上的“属性”,因此澄清这意味着什么会很有帮助。也许您指的是字段? (2认同)

Ste*_*han 9

看一下语法,这是不可能的:

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

你只能用以下方法破坏声明:

val (name, age) = person
Run Code Online (Sandbox Code Playgroud)


Pau*_*aum 5

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

var (a, b, c, d) = listOf("fly", 23, "slow", 28)
println("$a $b $c $d")
Run Code Online (Sandbox Code Playgroud)

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

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