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.
我正在与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封装的程度。
| 归档时间: |
|
| 查看次数: |
601 次 |
| 最近记录: |