|
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 18
|
|||||||||||
Как добиться неизменности параметра метода при его вызове?01.06.2011, 14:59. Показов 1897. Ответов 13
Метки нет (Все метки)
Хочу чтобы параметр метода не менялся внутри него. Пишу так
А если в классе SomeObject есть Sett'er метод для некоторого поля - field, то возможно следующее:
Как добиться того, чтобы обьект не менялся???
0
|
|||||||||||
| 01.06.2011, 14:59 | |
|
Ответы с готовыми решениями:
13
Ошибка при вызове метода
JNA и WinSock ошибка при вызове метода |
|
mishgun
|
|
| 01.06.2011, 20:44 | |
|
Bred kakoy to.
Metody i sushestvuyut chtob izmenyat kakie-to dannie. Ne hotitte chtob value menyalos obyavite final Sting STR_CONSTANT ='dont'change'; |
|
|
1 / 1 / 0
Регистрация: 15.02.2010
Сообщений: 311
|
|
| 01.06.2011, 23:01 | |
|
Передайте клон в качестве параметра. При этом оригинал, естественно, останется в неприкосновенности.
Однако зачем такие сложности?... Вы что, не знаете, что Вы делаете?
0
|
|
|
bid_relib
|
|
| 02.06.2011, 00:01 | |
|
да уж - вопрос задавался, наверное, в состоянии глубокого раздумья или отдладки-)
и ответы прикольные-)) |
|
|
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 18
|
||||||
| 02.06.2011, 08:04 [ТС] | ||||||
|
Почему спецификатор final отвечает только за ссылку на сам обьект,
и не распростроняется на его содержимое - по-моему это не очень логично. И зачем тогда он вообще нужен в таком описании функции:
0
|
||||||
|
1 / 1 / 2
Регистрация: 07.01.2010
Сообщений: 128
|
|
| 02.06.2011, 12:23 | |
|
Из вопроса не ясно, 'Хочу чтобы параметр метода не менялся внутри него' - это просто бунт разума против реальности, или планируется что-то типа Template Method или Injection of Control?
Если верно второе, то можно сказать следующее: 1. Мне не видится осмысленным в контексте этого вопроса обсуждать, ПОЧЕМУ модификатор final для параметра работает так, а не иначе. 2. 'Правильное' решение состоит в следующем: допустим, у вас есть класс C, экземпляр которого нужно передать в метод. Сделайте рефакторинг так, чтобы появился интерфейс I, содержащий только accessor methods этого класса, а класс C реализовывал этот интерфейс и добавлял к нему mutator methods. Тогда в своем коде вы будете использовать переменные типа C для хранения своих объектов, а вовне эти же объекты передавать через параметры типа I. Здесь есть один тонкий момент: если какой-либо accessor method возвращает Collection, то эту коллекцию, вероятнее всего, можно модифицировать, т.к. возврат копий коллекций или unmodifiable коллекций практикуется редко. Поэтому, в такой ситуации нужно решить, что есть меньшее зло: обернуть корневой объект во wrapper class, который будет перехватывать возвращаемые коллекции и оборачивать их в unmodifiable, или всегда возвращать unmodifiable Collection. Еще лучше сделать два интерфейса: [только accessor methods] -> [+ mutator methods] -> [класс] 3. Есть извращенный путь: использовать dynamic proxy, который будет контролировать доступ к методам. 4. Есть еще один извращенный путь: копировать объект перед передачей в метод. В этом случае нужно позаботиться, чтобы копирование было 'deep', то есть если корневой объект ссылается еще на какие-то объекты, должны копироваться не эти ссылки, а сами объекты.
0
|
|
|
paradise
|
||||||
| 02.06.2011, 12:27 | ||||||
|
Код на 5 баллов.
>и не распростроняется на его содержимое - по-моему это не очень логично. А по-моему, не очень логично пытаться запретить изменение объекта внутри отдельно взятого метода. На секунду представим, что final распространяется на объект. Т.е. тебе надо заставить всех, кто будет писать методы, использующие этот объект писать final с сигнатуре. Как это сделать - не понимаю. Зачем - тоже вопрос? Если ты пишешь метод, который не должен менять объект - просто не меняй его. Передавать копию объекта (клонировать) правильный выход в случае если ты хочешь оставить в покое исходный объект. Если не секрет, зачем тебе это? (Или, как принято спрашивать в некоторых формумах, где вы покупаете траву ?)
|
||||||
|
paradise
|
|
| 02.06.2011, 12:35 | |
|
>Хочу чтобы параметр метода не менялся внутри него
Как раз это ты и получишь - параметр метода - сслыка, а не объект. |
|
|
1 / 1 / 2
Регистрация: 07.01.2010
Сообщений: 128
|
|
| 02.06.2011, 13:26 | |
|
Поправка для внимательных: в моем предыдущем посте вместо Injection of Control читать Inversion of Control
0
|
|
|
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 18
|
|
| 02.06.2011, 17:07 [ТС] | |
|
Предоставляя пользователю некоторый класс, как я могу гарантировать
что вызываемые методы не искаверкают передаваемые в них обьекты этого пользователя?? И как узнать меняет ли метод какого-то класса мой обьект?? По-моему это обычная задача обеспечения безопасности и она не так уж бессмыслена.
0
|
|
|
1 / 1 / 2
Регистрация: 07.01.2010
Сообщений: 128
|
|
| 02.06.2011, 18:25 | |
|
Если пользователь вызывает метод вашего класса и передает ему аргумент-объект, то он сам должен позаботиться, чтобы передаваемый объект был неизменяемым. В противном случае то никто не должен требовать от вашего кода гарантий, что аргумент не будет изменен.
Если речь идет об обратной ситуации, смотрите мои предыдущие сообщения.
0
|
|
|
1 / 1 / 3
Регистрация: 03.08.2008
Сообщений: 390
|
|
| 05.06.2011, 13:01 | |
|
Думаю что вопрос решается клонированием.
Например: Есть некий контекст SystemContext в нём есть метод getMainCompany() private static Company company; .... public static Company getMainCompany() { return (Company) company.clone(); } И всё кто вычитывет объект компания может делать с ним что угодно Если имя компании будет измененно....то вычитка методом Company SystemContext.getMainCompany() будет всё равно возвращать исходную компанию
0
|
|
|
1 / 1 / 3
Регистрация: 03.08.2008
Сообщений: 390
|
|
| 05.06.2011, 13:03 | |
|
И ещё ..если поля объекта токо на чтение то в чём проблема....
создавай токо get методы.... а поля инить в конструкторе.....
0
|
|
|
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 18
|
|
| 05.06.2011, 13:12 [ТС] | |
|
Спасибо всем!!!
Я поступил так: В классе реализовал интерфейс: Readable, который содержит только Get'er методы моего обьекта (ну или все те, которые не изменяют обьект). Теперь в качестве если параметра передавать нге сам обьект а приводить его к интерфейсу, то метод не сможет поправить обьект.
0
|
|
| 05.06.2011, 13:12 | |
|
Помогаю со студенческими работами здесь
14
Исключение ClassNotFoundException при при вызове метода Class.forName JS: Как заменить свойство объекта при вызове его метода? Как указывать аргументы при вызове одного метода из другого? Как узнать сколько было блокировок при вызове метода Что означает первый параметр метода этого класса? И почему при вызове метода передаётся один параметр(второй)? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|