Нарушает ли Котлин правило инкапсуляции? - PullRequest
0 голосов
/ 05 июля 2018

Переменные используются public в классах, использующих модификатор видимости по умолчанию . Сеттер и геттер создаются для каждой переменной-члена, но в Kotlin вы делаете, например:

class Person {
    var name: String = "unknown"
}

fun main(args: Array<String>) {
    val person = Person()
    person.name = "kevvex"
    println("${person.name}")
}

Не нарушает ли это правило инкапсуляции из-за применения геттера и сеттера при использовании:

person.name = "kevvex"

Если так, как это может быть инкапсуляция? Переменная все еще общедоступна. Объявление его как приватного заставило бы меня создать сеттер и геттер для получения переменной из-за модификатора приватной видимости.

Я сравниваю с Java, который часто имеет переменные-члены в качестве private, а также общедоступный установщик и метод получения для каждой переменной-члена .

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я сравниваю с Java, который часто имеет переменные-члены как private, так и общедоступные сеттеры и геттеры для каждой переменной-члена.

Это именно то, что происходит в коде Kotlin. name это не поле (то, что вы называете переменной-членом), это свойство с частным вспомогательным полем. И если вы измените его геттер и сеттер:

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.

0 голосов
/ 05 июля 2018

Вы можете создать общедоступную переменную, но только с частным сеттером

var name: String = "unknown"
private set

Кроме того, вы можете редактировать поведение get или set, как в Java. С инкапсуляцией проблем нет, Kotlin значительно упрощает создание «POJO», создавая «установщики / получатели по умолчанию» как общедоступные

...