java - 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。
解决方案
我正在与 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 相同程度的封装。
推荐阅读
- python - 如何为python中的短语而不是单个单词创建wordcloud
- javascript - 为什么 Javascript 中的这个 for 循环给我一个数字而不是从 0 到 4 的数字列表?
- wordpress - 基于用户角色的 Woocommerce 新客户电子邮件
- javascript - (NodeJS)可以维护客户端索引变量以使用 EJS 遍历数据库元素吗?
- javascript - Javascript 10 天 - 第 3 天:数组 - HackerRank
- c++ - 如何从文件夹视图中删除组
- python - 根据 Keras 中的图像和子文件夹名称设置 X 和 y 用于训练 CNN
- c++ - QSqlDatabasePrivate::addDatabase: 重复连接名称 'qt_sql_default_connection'
- r - 如何消除“as.Date.OtherDate(death) 中的错误:外部函数调用中的 NAs (arg 4)”
- python - 第一个项目,pi 上的 Python 3,似乎一开始就无法正常运行