Смисъла от употреба на "Private"?
Здравейте,
имам модификатор за достъп "Private", той се използва за да се капсулират данни, които не искаме да се достъпват от другите класове или създаваме get..(), който позволява да използването на private елемнтите в друг клас, който искам да ги виждам.
Примерите са ми следните, имам 20 класа правя си в един клас private Sting name; искам 18 класа с помоща на get..() да достъпят name, a eдин да клас да не може да го достъпи. Идва другия момент правя си public String name; в един клас и така той става достъпен за всичките 19 класа, обаче пиша съответния name като код в 18 класа, като в 19тия клас изобщо не го пиша като код. Въпроса ми е, защо тогава се счита, че като използваш "Private" си защитаваш кода, като в двата случая, чрез код определяш кой клас да го достъпва?
Може да разледате и този пример http://www.progressivejava.net/2012/12/set-and-get-what-they-are-and-how-to-use-these-methods-correctly.html в който пак не ми става ясно защо трите елемента са private и ги достъпвам с get за да ги намнипулирам, защо просто не ги направя public пък аз ще определям кой клас да ги ползва.
Много ще съм ви благодарен за обяснение и примери!
Поздрави
Първо искам много да ти благодаря за отзивчивостта! :) Но не съм си го изяснил достатъчно. Ще използвам твоя пример с малка промяна
имаме клас Кола
който има прайвът поле Стойност
вътрешно класа може да работи с реалните километри но в гетъра да сложим
return Стойност - 20 000;
Имам Клас Мерцедес
чрез гетСтойност() достъпвам сумата и я манипулирам по някакъв начин и я правя 10 000; в друг случай правя стойност да е публик и така без да е нужно да използвам гет пак мога да я маниплира.
Тука идва недоброжелателен човек и ми разбива системата с цел да промени стойността от 10 000лв на 2 000лв. , обаче и двата случая даден клас наследник може да използва данните и да се манипулира стойността. Идеята за private не е ли точно тази да блокира именно този тип промяна от хакери, въпроса е, че или не мога да си го представя като хората или private защита няма нищо общо с хакерите?
Значи няма как хакер да влезе и да разбие класа :).
Просто с гетера и сетера контролираш как да се използва ресурса - този ресурс който трябва да е публичен, под публичен разбирай че може да го използват всички. Иначе останалите ресурси са прайвът и никой няма достъп до тях.
Ако искаш вече различните класове които наследяват базовия клас да имат различни поведения на контрола на публичните полета - може да го направиш като интерфейс както написах преди малко. Ако не ти е ясно за какво говоря - пиши ще ти обясня по-подробно.
П.С.: Ако искаш дай един по-конкретен случай който те мъчи, за да се опитаме да ти покажем как се прави.
Класическа грешка е да се бърка капсулацията със сигурност. Идеята на капсулацията е да се скрие имплементацията и да се покаже само каквото е нужно. Така по подразбиране всичко е скрито и ако трябва да бъде показано на външния свят, когато говорим за данни, демек полета, се правят публични гетъри и сетъри. Това не те защитава от хакери, но подсигурява, че при липса на умисъл приложението да бъде счупено, въпросният клас ще се ползва по правилен и улеснен начин.