【问题标题】:Shorthand syntax for generating toString() method in Kotlin (for non-data classes)在 Kotlin 中生成 toString() 方法的简写语法(用于非数据类)
【发布时间】:2017-11-23 12:10:24
【问题描述】:

在 Kotlin 中,可以为数据类生成 toString() 方法:

data class Foo(...)

但是使用数据类有一些限制,加上 Kotlin 编译器会生成额外的方法,我不想在我的代码中使用这些方法。

在Java中,只需添加一行带有@ToString注解的代码,就可以使用Lombok生成toString()方法:

@ToString
public class Foo {
    ...
}

很遗憾,Lombok 不支持 Kotlin,所以我每次都要手动实现 toString() 方法:

class Foo {
    ...
    override fun toString(): String {
        // bunch of code here
    }
}

在 Kotlin 或第三方解决方案中是否有任何简写语法?

【问题讨论】:

  • 我不知道这样的解决方案(例如 Lombok @toString),也许您可​​以实现一个抽象类并使用反射覆盖 toString 一次以使其通用,但看起来不是个好主意。或者尝试在 Kotlin slack 频道询问,有很多 JB 人,他们更了解
  • 是否有你不想要额外方法的原因,或者只是为了减少方法的数量?

标签: java kotlin lombok


【解决方案1】:

如果您允许Apache Commons Lang,您可以使用ToStringBuilder,它允许这样做:

override fun toString() = ToStringBuilder(this)
    .append("field1", field1)
    .append("field2", field2)
    .toString()

或者,以一些速度为代价,采用更短的反射解决方案:

override fun toString() = ToStringBuilder.reflectionToString(this)

可以通过将不同的ToStringStyle 传递给构建器来更改格式。

我不相信 Kotlin 本身对此有任何支持。

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多