使用默认可见性修饰符在类中将变量公共使用。将为每个成员变量创建一个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"
如果是这样,怎么封装?该变量仍然是公共的。由于使用了私有的可见性修饰符,将其声明为private会迫使我创建一个setter和getter来获取变量。
我正在与Java进行比较,Java的成员变量通常是私有的,而每个成员变量都有公共的setter和getter 。
答案 0 :(得分:4)
我正在与Java进行比较,Java的成员变量通常是私有的,而每个成员变量都有一个公共的setter和getter。
这实际上是此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封装的程度。
答案 1 :(得分:0)
您可以创建公共变量,但只能使用私有设置器
var name: String = "unknown"
private set
此外,您可以编辑get或set的行为,就像在Java中一样。封装没有问题,Kotlin通过将“默认设置器/获取器”创建为公共设置器,使“ POJO”的创建更加容易