Kotlin 是否打破了封装规则?

Does Kotlin break the rule of encapsulation?

在 类 中使用 public 变量,使用 默认可见性修饰符 。为每个成员变量创建了一个 setter 和一个 getter,但是在 Kotlin 中你这样做例如:

class Person {
    var name: String = "unknown"
}

fun main(args: Array<String>) {
    val person = Person()
    person.name = "kevvex"
    println("${person.name}")
}

由于使用时应用了getter和setter,这是否仍然没有违反封装规则:

person.name = "kevvex"

如果是,那怎么可能是封装呢?变量还是public。由于私有可见性修饰符,将其声明为私有会迫使我创建 setter 和 getter 来获取变量。

我正在与 Java 进行比较,后者通常将成员变量作为私有变量,并且每个成员变量都有 public setter 和 getter

您可以创建 public 变量,但只能使用私有 setter

var name: String = "unknown"
private set

此外,您可以编辑 get 或 set 的行为方式,就像在 Java 中一样。封装没有问题,Kotlin 通过将 "default setters / getters" 创建为 public ones

使 "POJOs" 创建变得容易得多

I'm comparing to Java that often has member variables as private and a public setter and getter for every member variable.

这实际上就是这段 Kotlin 代码中发生的事情。 name 不是一个字段(你称之为成员变量),它是一个带有私有支持字段的 属性。如果你修改它的 getter 和 setter:

var name: String
    get() = ...
    set(value: String) { ... }

来电者继续使用

person.name = "kevvex"

并且不需要重新编译。

var name: String = "unknown" 完全 等同于 Java 的

private String _name = "unknown";
public String getName() { return _name; }
public void setName(String name) { this._name = name; }

甚至会从 Java 看到那样。所以它破坏封装的程度与 Java 一样。