Kotlin是否违反封装规则?

时间:2018-07-05 13:32:31

标签: java kotlin encapsulation

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

2 个答案:

答案 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”的创建更加容易