“将属性 getter 转换为初始值设定项” - 但它们不是同一件事,不是吗?

Rya*_*ndy 5 intellij-idea kotlin

我将 IntelliJ 与混合 Java/Kotlin 项目一起使用。在我的 Kotlin 文件之一中,我有以下属性:

override val value: String
    get() {
        return webElement.getAttribute("value")
    }
Run Code Online (Sandbox Code Playgroud)

IntelliJ 的灯泡提供“将属性 getter 转换为初始值设定项”,这会将代码更改为:

override val value: String = webElement.getAttribute("value")
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎不是一个简单的重构,而是一个重大的代码更改。我认为正在发生的事情是:

  • 在第一个版本中,value当我调用 时会检索该属性value

  • 在更改后的版本中,该value属性在构造类实例时立即设置,然后对该类实例永远不会更改。

但也许这更像是 C# 表达式主体成员,它使用 lambda 箭头=>而不是大括号,return但在其他方面的工作方式完全相同。

那么……是哪个?第二版代码何时初始化?

Jen*_*anu 5

您对这些陈述的看法是正确的:

\n
\n
    \n
  • 在第一个版本中,当我调用 value 时,会检索 value 属性。

    \n
  • \n
  • 在更改后的版本中,在构造类实例时立即设置 value 属性,然后对该类实例永远不会更改。

    \n
  • \n
\n
\n

IntelliJ 的灯泡提供“将属性 getter 转换为初始化器”,因为它只是一个可用选项。灯泡仅突出显示您可以使用选定的代码片段执行的操作。

\n

IntelliJ 不会试图告诉您“属性初始值设定项”和“属性获取器”是相同的。它告诉您的是,如果您愿意,可以将其中一种转换为另一种。

\n

我同意这很令人困惑,特别是考虑到IntelliJ Idea 文档中的这段引用:

\n
\n

一旦 IDE 找到更改代码的方法,它就会在编辑器中当前行旁边显示一个黄色灯泡图标。通过单击此图标,您可以查看此代码单元可用的意图操作。意图操作涵盖从警告到优化建议的多种情况。您可以查看完整的意图列表并在“设置/首选项”对话框 \xe2\x8c\x98 中自定义它们。

\n
\n

考虑到这一点,您的代码可能会被优化或出现警告。

\n

答案

\n
\n

第二版代码何时初始化?

\n
\n
\n

...当类实例被构造时立即。

\n
\n

你是对的。

\n