Приватные и публичные поля

1,187
31
182
Почему стоит делать приватными поля в своем классе и в чем недостаток публичных?
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Поясню на примере смысл приватных методов. Берем машину - ну скажем для определенности Audi. Смотрим на нее с точки зрения ООП. И так что мы видим:
1. public методы: завести, включить передачу, нажать на газ/тормоз и проч.
2. protected методы: управление магнитолой, приборами и проч. которые общие для всех моделей Audi. Правда, как и полагается в старших моделях Audi производитель может и реально делает Override некоторых методов родительского класса.
3. private методы: настройка системы распределения зажигания, тюнинг клапанов и проч. проч. хитрые способы, куда обычному юзеры с шаловливыми ручками лезть не стоит.
P.S. Конечно, всегда находятся особенно хитро*опые товарищи, которые начинают лезть в приватные методы с целью, скажем чип-тюнинга машины. Для Java аналогом таких способов является доступ к закрытым методам с помощью рефлексии.

Смысл private полей и методов
 
1,187
31
182
То есть, если оставлю поля публичными, обычные юзеры смогут как то юзать их и менять как угодно?
 
Потому что когда ты делаешь поле приватное, ты можешь регулировать его установку и чтение значения путем создания сеттеров/геттеров. У публичных полей такая функция отсутствует.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Да. Простой пример: ограничить минимальное и максимальное значение переменной. Если поле будет публичным, то это никак не сделать. Если же оно будет приватным, то ты создаешь сеттер и в нем уже делаешь проверку.
 
7,099
324
1,510
Делай поля финальными и норм, их нельзя изменить
 
1,187
31
182
Сябки, агравэйн, можно даже сеттеры не создать :)
Тогда вообще никто не сможет менять)
Стоп, а если я например имею конструктор у итема с приватными полями
И присваиваю этим полям значения из нового обьекта
Вроде:

Java:
//конструктор
this.damage = damage;
//конструктор
А потом создаю итем в итемлоадере
Java:
someItem = new ItemWeapon(someParameter, damage, someParameter);
В этом итемлоадере можно изменять значения приватной переменной damage. Получается, что с этим делать?
 
7,099
324
1,510
При передачи примитива через аргументы - он по сути копируется
 
7,099
324
1,510
Ага
 
7,099
324
1,510
7,099
324
1,510
АТ только для ванили, и если их юзаешь - то тот же вандал
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
А ещё есть выделение публичного API.
Если твою либку, к примеру, до фига людей юзает, то лучше бы тебе с апдейтами версий не менять публичные методы, поля и прочее.
То бишь публичными методами ты описываешь своё API, и ими все пользуются, а приватные - это всякие имплементации и внутренности, и ты будешь полностью в своём праве менять их как угодно.

Есть такая штука, семантическое версионирование, это когда версии твоего кода выглядят как x.y.z, где x - мажорная версия, y - минорная и z - патч.
Большинство FOSS ему следует, и ему надо следовать, очень полезная штука.
Оно описывает, что в процессе создания своего продукта, z ты увеличиваешь, если апи не меняется, y - если дополняется (добавил ещё публичных елементов, не меняя старых) и z - если таки пришлось изменить публичное апи.
Подробнее по ссылке крч.

Майнкрафт нихренашечки ему не следует, Фордж старается.

А да, ещё конкретно в джавке вообще все поля обычно делаются приватными и по желанию им делаются геттеры-сеттеры, потому-что во-первых так принято, во-вторых в жабке нету пропертей которые таким образом мимикрируются, ну и ещё я вроде слышал что там какая-то штука с многопоточностью.
Ну и опять же в рамках публичного апи, ты можешь сделать геттер, но менять поле только внутри класса, просто полю нельзя отдельно менять публичность получения и выставления его значения (ну в принципе это я и имел ввиду когда когорил про мимикрию пропертей из шарпов там всяких (да котлинов, которые сами взяли половину няшностей из шарпов) ).
А ещё всякие прекондишены и ограничения, ну это выше писали (и в пропертях такое тоже есть).
 
Сверху