首页 > 解决方案 > Kotlin 是否打破了封装规则?

问题描述

变量在使用默认可见性修饰符的类中公开使用。为每个成员变量创建了一个 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"

如果是这样,那怎么可能是封装?该变量仍然是公开的。由于私有可见性修饰符,将其声明为私有将迫使我创建一个 setter 和 getter 来获取变量。

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

标签: javakotlinencapsulation

解决方案


我正在与 Java 进行比较,Java 通常具有私有成员变量和每个成员变量的公共 setter 和 getter。

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

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

来电者继续使用

person.name = "kevvex"

并且不需要重新编译。

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

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

甚至会像这样从 Java 中看到。所以它破坏了与 Java 相同程度的封装。


推荐阅读