С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 18

Как добиться неизменности параметра метода при его вызове?

01.06.2011, 14:59. Показов 1897. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу чтобы параметр метода не менялся внутри него. Пишу так

Java
1
2
3
void someFunction(final SomeObject someObject){
  someObject = null;
}
и это не проходит.

А если в классе SomeObject есть Sett'er метод для некоторого поля - field, то возможно следующее:

Java
1
2
3
void someFunction(final SomeObject someObject){
  someObject.setField(newField);
}
и это проходит.

Как добиться того, чтобы обьект не менялся???
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.06.2011, 14:59
Ответы с готовыми решениями:

Ошибка при вызове метода
добрый вечер. Сделал задание в Си# теперь его надо перевести в Java. Вот привожу отрывок кода как сделать чтоб он заработал. ошибки в ...

NulPointerlException при вызове метода другого класса
При нажатии на кнопку в "New" (фрейм) должен выполняться метод catchNew класса Panel, наследника JFrame Вот фрагменты кода. Это...

JNA и WinSock ошибка при вызове метода
пытаюсь реализовать при помощь JNA и WinSock. Пишу интерфейс private interface Winsock extends Library { int select(int x,...

13
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 отвечает только за ссылку на сам обьект,
и не распростроняется на его содержимое - по-моему это не очень логично. И зачем тогда он вообще нужен в таком описании функции:
Java
1
void someFunction(final SomeObj someObj){}
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 баллов.
Java
1
2
3
void someFunction(final SomeObject someObject){
 someObject.setField(newField);
}
>Почему спецификатор final отвечает только за ссылку на сам обьект,
>и не распростроняется на его содержимое - по-моему это не очень логично.

А по-моему, не очень логично пытаться запретить изменение объекта внутри отдельно взятого метода.

На секунду представим, что 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.06.2011, 13:12
Помогаю со студенческими работами здесь

Исключение ClassNotFoundException при при вызове метода Class.forName
Сразу говорю опыта у меня мало )) Разработанный в Oracle9i JDeveloper проект был перенесен на tomcat 4. В сервлетах просходит коннект к...

JS: Как заменить свойство объекта при вызове его метода?
const Some = { hello: 'hello', sayHello: function() { console.log( this.hello ); }, init: function() { self = this; ...

Как указывать аргументы при вызове одного метода из другого?
Добрый день! Прошу прощения за совсем примитивизм: public void panel1_paint(Object sender, PaintEventArgs e) { ...

Как узнать сколько было блокировок при вызове метода
привет есть многопоточное приложение использую synclock можно как то узнать как часто потоки лочатся - и где именно

Что означает первый параметр метода этого класса? И почему при вызове метода передаётся один параметр(второй)?
public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration config, string apiDescriptionId)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru