Ответ
Обращение к полям класса напрямую нарушает инкапсуляцию и может привести к:
- Невалидным состояниям – отсутствие контроля при изменении значений.
- Сложности рефакторинга – изменение поля требует правки всех мест, где оно используется.
- Проблемы с многопоточностью – отсутствие синхронизации при доступе.
Пример:
class User {
var age: Int = 0 // Плохо: прямое изменение без валидации
}
// Где-то в коде:
user.age = -100 // Некорректное значение
Решение:
class User {
private var _age: Int = 0
var age: Int
get() = _age
set(value) {
require(value >= 0) { "Age cannot be negative" }
_age = value
}
}
Используйте свойства с кастомными геттерами/сеттерами или методы для безопасного доступа.
Ответ 18+ 🔞
Ага, слушай, вот что меня бесит до усрачки — когда люди в коде лезут прямо в поля класса, как к себе домой в холодильник. Это же, ёпта, пиздец как нарушает всю инкапсуляцию, понимаешь? Типа, зачем тогда вообще классы, если всё нараспашку?
Ну представь, у тебя есть класс User, и там поле age просто торчит, как хуй с горы. И любой ушлёпок в коде может взять и написать user.age = -100. И что? Возраст минус сто лет, ядрёна вошь! Это же полный бред, человек ещё не родился, а уже пользователь. Какой нахуй валидации? Какие проверки? Их просто нет, потому что поле публичное!
И ладно бы только это. Ты потом решишь поле переименовать или тип поменять — и пошло-поехало. Тебе теперь надо бегать по всему проекту, искать все эти user.age и править. Это же, блядь, овердохуища работы! А если ещё и многопоточность где-то рядом шуршит — так тут вообще пипец, состояние объекта может разъехаться в разные стороны, потому что синхронизации-то никакой.
Смотри, как надо делать по-человечески, чтобы не было потом мучительно больно:
class User {
private var _age: Int = 0 // Спрятали подальше, в приват
var age: Int
get() = _age // Читать можно всем
set(value) {
require(value >= 0) { "Age cannot be negative" } // А вот писать — только с проверкой
_age = value
}
}
Вот видишь? Всё просто, как три копейки. Хочешь изменить возраст? Пожалуйста, но сначала пройди валидацию. Не нравится? Иди нахуй с твоим минус сто. И рефакторить теперь легко — меняй внутреннее поле _age как хочешь, публичный интерфейс age останется тем же, и весь внешний код даже не чихнёт.
Короче, правило железное: не давай никому лапать внутренности объекта. Используй свойства с геттерами-сеттерами, или методы-геттеры с префиксом get, если уж совсем старовер. Но не открывай поля просто так, это признак распиздяйства и лени, а не программирования.