Я попытался создать прайват конструктор, но объект все равно удалось создать
Sasha
46 уровень
Привет) Как можно запретить создание экземпляров класса, не используя abstract.
Обсуждается
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
10 августа 2021, 10:06
Чтобы запретить создание экземпляров, наверное только ключевое слово abstract.
Все остальные способы можно обойти с помощью рефлексии, класслоадеров, манипуляциями байткода и тд.
Другое дело, что все зависит от твоей задачи, поскольку вопрос звучит "как сделать так, чтобы мою дверь не взломали, кроме как замуровать стену", ответ простой - никак. Если будет Дверь, ее можно взломать, абсолютно любую.
Но в реальной жизни мы же пользуемся дверьми? Потому что мы понимаем, что удобство от наличия двери гораздо выше риска быть взломанным.
Но чем выше ставки, например если в квартире только носки, трусы и гора мусора - пусть ломают на здоровье, можно закрывать на копеечный замок, лишь бы бомжи/наркоманы не вломились и не устроили вечеринку во время отсутствия хозяина.
Если в квартире уже ремонт, какие-то пожитки, ноутбук или вещи, уже мы ставим чуть посерьезнее замок, он не остановит всех грабителей, но скучающие школьники не сломают, и хоть 5-10-20 секунд времени (если повезет) могут дать, а не повезет, ну и ладно, что поделаешь, не так уж и критично, неприятно, но не критично.
Если в квартире уже есть ценности, которые реально нужно охранять, ставится сигнализация, может и не одна, ставится максимального класса для жилого помещения дверь, выбирается место для дома/квартиры с более тщательным контролем периметра, чем "я от горэнерго - проходите куда хотите".
Если это жилой дом богатого человека или промышленный объект с ценным оборудованием или материалами - там к предыдущему этапу (соответствующего класса двери, сигнализация) добавляется круглосуточная охрана, ранжируемая в пределах дедушки одуванчики до подготовленных бойцов с огнестрелом и опытом боевых действий.
Ну и последний этап это правительственные дачи "избранных", на которых могут быть сотни бойцов, система ПВО, отряды боевых пловцов с автоматами, ракетные комплексы.
0
Justinian Judge в Mega City One Master
10 августа 2021, 10:06полезный
Так и в джаве, ты смотришь на свои цели, что тебе критично, и выбираешь подходящий инструмент.
В обычных ситуациях достаточно приватного конструктора.
Если есть обоснованное конкретными требованиями желание повысить уровень защиты, нехитрые реализации модифицированного синглтона возможно с SecurityManager.
Ракетные турели в хрущовки не ставят. Как и золотой запас не закрывается на китайскую дверь за 50 у.е. без охраны, под каждую ситуацию свой набор решений. Подчеркиваю слово "набор".
+1
Sasha Middle Java Developer в EPAM
10 августа 2021, 11:09
А почему мне удалось создать объект при приватном конструкторе?
0
hidden #598481
10 августа 2021, 11:18
так ты наверное внутри этого класса их и создавал.
в соседнем классе уже не смог бы
0
Justinian Judge в Mega City One Master
10 августа 2021, 11:30
Ты заставляешь достать с под полы хрустальный шар и начинать спиритический сеанс, что из 9999 вариантов может быть в твоем случае.
На будущее, всегда старайся давать контекст, вопросы "Саша, вот я только что не смог сделать сальто, почему?" это не вопрос, может я лежу, может меня привязали к батареи, может у меня две ноги в гипсе, да что угодно. Всегда давай контекст, самая основная ошибка задающих вопросов, они не смотрят на вопросы глазами других, они живут в каком-то контексте и им кажется,что и другие живут в таком же контексте, но это не так.
Задаешь вопрос, и читаешь его глазами других, хватит ли им информации которую ты дал или нет.
Если спрашиваешь почему у тебя удалось что-то сделать, ты должен обязательно расписать, что именно ты делаешь, если тебя переспрашивают, уточняют, значит информации ты дал мало. Человеку проще будет проигнорить твой вопрос чем играть в партизано-гестапо "признавайся русише партизан, дафай раскрой Военную тайну! Что за код ты запускал! " это утомляет, те кто может тебе помочь, как правило очень занятые, те у кого много времени, у них знаний нету.
По твоему вопросу, предположу, что ты создал экземпляр класса что-то так:
Вот так можно, поскольку приватные члены класса доступны другим членам этого класса.
Но здесь уже странная ситуация:
Как сделать так, чтобы через мои двери не прошли чужаки?
- Можешь замуровать дверной проем. Или просто купить средние двери с замком и закрой их.
- Ага, но я вот купил средние двери с замком, открыл их нараспашку и чужаки таки прошли! 0
Justinian Judge в Mega City One Master
10 августа 2021, 11:31
Я не знаю что здесь ответить, а зачем двери было открывать?
Здесь все упирается в здравый смысл.
Объясни что ты хочешь сделать, это Макс в чате спрашивал, про связь инкапсуляции с тем, что любой разработчик имеет доступ к коду и может к примеру вот это:
сделать:
или написать:
но против этого только один прием - не давать доступ к коду.
Если человека посадили за штурвал самолета (разработчик имеет доступ к коду проекта) то понятно, что человек может сделать как хорошее так и плохое.
Например пилот пассажирскго Боинга поссорился с девушкой и направил самолет в скалы. Это вопрос здравого смысла.
Риск этого будет всегда.
Поэтому вопрос звучит просто:
если нужно сделать так,чтобы в другом классе нельзя было инстанциировать класс - ну тогда приватный конструктор.
Если нужно защитить код таким образом, чтобы программист не смог поломать конкретный класс это либо невозможно, либо выделять код в отдельную библиотеку и то, нужно держать в голове, что все-равно можно поломать при сильном желании.
Вопрос простой -
1) какие твои конкретные цели
2) какая вероятность что это событие произойдет
3) насколько это для тебя нежелательно
В джаве и в инженарии в целом ВСЕГДА отталкиваются от четких и конкретных целей и обстоятельств.
Приватный конструктор, создание экземпляра класса это просто инструменты. Если у тебя нет конкретной цели - ты не сможешь получить ответ на свой вопрос.
Нет конкретного задания - нет конкретной задачи - инструменты теряют смысл. 0