当涉及到 Kotlin 中的封装时,大多数变量是否可以 public 不像 Java 因为它具有 getter 和 setter 属性?

When it comes to encapsulation in Kotlin, can most variables be public unlike Java since it has getter and setter properties?

我确定一个明显的例外是,如果你想要一个在它声明的范围内 使用的变量,但除此之外,大多数变量可以 public 如果您希望它是只读的,则使用私有集,或者如果出于某种原因您希望它只写,则使用 private get?还是有其他我不知道的原因?

这可能被认为是一个明显的答案,也许不是,但这更多只是证实了我作为在 Java 方面有经验的人的知识,并且习惯于必须将所有实例变量声明为私有并使用 getter/setter 方法。

您将使用与 Java 中等效的 getters 和 setters 相同的基本可见性决定。您通常不会为 class 中的每个字段创建 getter——只创建从外部使用它所必需的字段。

有时封装只是意味着不要暴露比你需要的更多的东西。一个 public 只公开许多 getter 在 class 之外没有用处的 class 更难使用。 IDE 中的 Auto-complete 会推荐一堆你不需要的东西,任何人都需要更长的时间来查看你的 class 的 public 成员并了解如何使用它。

请注意,Kotlin 不允许您定义具有比 getter.

更高可见度的 setter 的 var

有一件事与您的问题有关……如果您担心它们的 setter 将来可能变得更加复杂,则无需防御性地将属性设为私有。例如,在 Java 中,您通常必须抵制暴露 public 字段的简单性,因为它可以防止在不破坏外部代码的情况下改进字段的使用方式或添加副作用来设置它,所以你通常使用带有 public setter 的私有字段,即使是对于琐碎的字段也是如此。在 Kotlin 中,您永远不会 publicly 公开一个字段。您的属性可以是没有自定义 getter 或 setter 的简单属性,但您将来仍然可以灵活地更改它们以使用自定义 getters 或 setters 和私有支持属性等,无需修改 class.

的 public 面

这是我认为从 Java 映射到 Kotlin

的方式
Java Kotlin
private field, no getter or setter private val or private var
private field, public getter, no setter public val or public var with private set
private field, public getter and public setter public var
private field, no getter, public setter private var with public fun set...()