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 一样。
在 类 中使用 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 一样。