Kotlin是否违反封装规则?

kev*_*vex 1 java encapsulation kotlin

使用默认的可见性修饰符在类中公共使用变量。将为每个成员变量创建一个setter和一个getter,但是在Kotlin中,您可以执行以下操作:

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

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

由于在使用时使用了getter和setter方法,这是否仍未违反封装规则?

person.name = "kevvex"
Run Code Online (Sandbox Code Playgroud)

If so, how can that be encapsulation? The variable is still public. Declaring it as private would force me to create a setter and getter to get the variable, because of the private visibility modifier.

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

Ale*_*nov 5

我正在与Java进行比较,Java通常将成员变量作为私有变量,而每个成员变量都有一个公共的setter和getter。

这实际上就是此Kotlin代码中发生的事情。name不是字段(您称其为成员变量),而是具有私有后备字段的属性。如果您修改其getter和setter:

var name: String
    get() = ...
    set(value: String) { ... }
Run Code Online (Sandbox Code Playgroud)

呼叫者继续使用

person.name = "kevvex"
Run Code Online (Sandbox Code Playgroud)

并且不需要重新编译。

var name: String = "unknown"正好等同于Java的

private String _name = "unknown";
public String getName() { return _name; }
public void setName(String name) { this._name = name; }
Run Code Online (Sandbox Code Playgroud)

甚至可以像这样从Java中看到。因此,它破坏了Java封装的程度。