🗒 Задача¶
В приложении для хранения облачных файлов есть папки и файлы.
Создай класс папки, который имеет имя, количество файлов и флаг “секретно”. Если флаг имеет значение true, то при попытке прочитать имя, возвращать строку “скрытая папка” и количество файлов – 0. В ином случае возвращать ее название и реальное количество файлов. Для реализации должны использоваться геттеры.
Создай экземпляр “скрытой” папки. Протестируй попытку чтения ее данных.
❌ Ошибки¶
-
название класса сущности во множественном числе — объяснить что класс, это шаблон одного будущего объекта в данном контексте
-
при обращении к папке присваивают
✏️ Комментарии¶
val name: String и val folderName: String
с помощью вал выделяет память под две переменные одного значения. что излишнее действие.
следует забирать данные в основном конструкторе и присваивать их объявленному полю внутри класса, где используется кастомный сеттер или геттер. так что предлагаю проинициализировать полем name (и для name не выделять память)
Название будущего экземпляра папки в данном контексте корректнее делать в единственном числе. Это шаблон будущей сущности.
Получилось немного сумбурно. Здесь не сразу понятно какая именно папка создается. Давай сделаем класс более универсальным. Предлагаю оставить объявленные поля в теле класса, как сейчас. Но еще добавим основной конструктор и продублируем их туда с `_` в начале. Таким образом мы и геттер переопределяем, и с любым значением, которое нам нужно создаем объект.
По условию мы задаем конкретный объект папки. У сущности есть поля для этого объекта, так как нам нужен универсальный класс, а иначе во всех созданных объектах по умолчанию будет создаваться по N файлов.
А может обойдемся без создания дополнительных приватных полей для которых требуется кастомизация геттеров/сеттеров?)
Отлично. Теперь чуть оптимизируем.
- Можно возвращать в более короткой форме (без return)
- И так как в условном выражении только по одной строке в ветках, можно опустить скобки и компактно разместить на одной строке `get() = if (isSecret) 0 else field`
🧾 Решение¶
class Folder(
name: String,
fileCount: Int,
private val isSecret: Boolean,
) {
val folderName = name
get() = if (isSecret) "скрытая папка" else field
val folderFileCount = fileCount
get() = if (isSecret) 0 else field
}
fun main() {
val secretFolder = Folder("Мои Документы", 10, true)
println("Имя папки: ${secretFolder.folderName}")
println("Количество файлов: ${secretFolder.folderFileCount}")
}