Menu
Coddy logo textTech

Модификаторы видимости

Часть раздела Объектно-ориентированное программирование путешествия по Kotlin на Coddy. Урок 8 из 57.

Инкапсуляция означает, что класс контролирует, как используются его данные. Модификаторы видимости определяют, кто может видеть член класса. private скрывает его от всего, что находится за пределами класса, поэтому собственные методы класса — единственный способ получить к нему доступ:

class Account {
    private var balance = 0

    fun deposit(amount: Int) {
        if (amount > 0) balance += amount
    }

    fun report() = "balance: $balance"
}

Внутри main:

val a = Account()
a.deposit(50)
a.deposit(-999)
println(a.report())
// a.balance = 1_000_000    // ошибка: нельзя получить доступ к 'balance': он private

Вывод:

balance: 50

В Kotlin есть четыре модификатора. Без одного из них объявление является public и доступно везде:

public      // по умолчанию: видно везде
internal    // видно в том же модуле (приложение или библиотека)
protected   // видно в классе и его подклассах
private     // видно внутри класса (или файла, для объявлений верхнего уровня)

Приватные вспомогательные функции сохраняют публичный интерфейс небольшим. Вызывающий код видит, что делает класс, а не как он это делает:

class Password(private val text: String) {
    val isStrong: Boolean
        get() = hasDigit() && text.length >= 8

    private fun hasDigit() = text.any { it.isDigit() }
}

Внутри main:

println(Password("secret123").isStrong)
println(Password("short1").isStrong)

Вывод:

true
false

Свойства конструктора тоже принимают модификаторы: private val хранит значение, которое внешний код не может прочитать. Сокрытие данных позволяет классу проверять каждое изменение и соблюдать свои правила:

class Locker(private val code: String) {
    private val items = mutableListOf<String>()
    fun store(item: String, code: String): Boolean {
        if (code != this.code) return false
        items.add(item)
        return true
    }
}
challenge icon

Задание

Легко

Завершите класс Locker(private val code: String). Его список items является закрытым. store(item, code) добавляет элемент только при совпадении кода и возвращает значение, указывающее, произошло ли добавление; open(code) при совпадении кода возвращает элементы, объединённые с помощью , (или empty), а в противном случае — wrong code.

Предоставленный код считывает код замка, а затем команды put <code> <item> или open <code>. Для каждой команды put он выводит stored или denied, а для каждой команды open — результат.

Ваш код должен находиться в Locker.kt. В Main.kt содержится предоставленный код ввода/вывода, и его нельзя редактировать.

Попробуйте сами

fun main() {
    // Предоставленный код ввода/вывода: оставьте его как есть
    val input = generateSequence(::readLine).toList()
    val locker = Locker(input[0])
    for (cmd in input.drop(1)) {
        val p = cmd.split(" ")
        if (p[0] == "put") println(if (locker.store(p[2], p[1])) "stored" else "denied")
        else println(locker.open(p[1]))
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Песочница Kotlin