Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> При инициализации объекта в методе теряется ссылка 
:(
    Опции темы
Andrey1
Дата 17.4.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 1
Всего: 5



Столкнулся с такой ситуацией...

Если в методе инициализировать объект:

Код

void doSetSomeData(myClass object)
{
 object = new myClass();
 object.setSomeData();
...
}


и захотеть передать данные в объект myObject через этот метод аля: doSetSomeData(myObject)
то, если myObject = null, то данные не передадутся!..

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

Это сообщение отредактировал(а) Andrey1 - 17.4.2008, 12:05


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
_Y_
Дата 17.4.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Скучнo, конечно, но это именно так. 

Дело в том, что метод ничего не возвращает по параметрам. В мануалах написано, что обьекты передаются по ссыке и это может быть неправильно понято. Наверное точнее будет сказать, что все параметры передаются методу по значениям, но обьекты можно передавать только передавая значения ссылок на них.

Вызов передает методу значение ссылки на обьект класса myClass. Метод new записывает в переменную object новую ссылку. Но переменная object -то видна только внутри метода doSetSomeData, а переманная, содержащая ссылку на исходный обьект (та, что в коде вызвавшем метод doSetSomeData) при этом не изменяется. 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
fixxer
Дата 17.4.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



И это правильно, потому что я бы не хотел, чтобы любой метод, куда я передаю свой объект мог бы изменить его иначе чем через контракт, который я ему предоставляю.


--------------------
user posted image
PM MAIL ICQ   Вверх
math64
Дата 17.4.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Можно защититься от таких ошибок объявляя параметры final - некоторые IDE делают так при создании метода.
PM   Вверх
Andrey1
Дата 17.4.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 1
Всего: 5



Цитата(fixxer @  17.4.2008,  12:34 Найти цитируемый пост)
И это правильно, потому что я бы не хотел, чтобы любой метод, куда я передаю свой объект мог бы изменить его иначе чем через контракт, который я ему предоставляю. 

Да, в такой интерпретации что-то хорошее есть smile...


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
Dims
Дата 18.4.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



Цитата(Andrey1 @  17.4.2008,  12:01 Найти цитируемый пост)
если myObject = null, то данные не передадутся

Что-то я не понял, причём тут null? Данные не передадутся в любом случае, если myObject-у чего-то присваивается. Совершенно неважно, new или не new, и чему была равна переменная до вызова -- если она затёрта, то она не передастся.

PM MAIL   Вверх
Andrey1
Дата 18.4.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 1
Всего: 5



Цитата(Dims @  18.4.2008,  19:44 Найти цитируемый пост)
Что-то я не понял, причём тут null? Данные не передадутся в любом случае, если myObject-у чего-то присваивается. Совершенно неважно, new или не new, и чему была равна переменная до вызова -- если она затёрта, то она не передастся.

Да, все так... Думаю, все друг друга поняли.... Все равно грустно... smile

Разница в том, что если передаваемый объект = null (что можно было бы использовать как некий флаг...), то этому объекту метод вообще ничего передать не может (ни инициализировать его...).

Странно только, действительно, почему все параметры метода в Java не считаются final по умолчанию....


Это сообщение отредактировал(а) Andrey1 - 18.4.2008, 20:38


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
Dims
Дата 18.4.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



Цитата(Andrey1 @  18.4.2008,  20:26 Найти цитируемый пост)
Разница в том, что если передаваемый объект = null (что можно было бы использовать как некий флаг...), то этому объекту

Не понял, какому "этому"? Если передаваемая ПЕРЕМЕННАЯ содержит null, то это означает, что НИКАКОГО ОБЪЕКТА нет, она ни на что не ссылается. Кого в этом случае Вы хотите инициализировать?

Добавлено через 4 минуты и 55 секунд
P.S. В джаве есть два рода переменных: примитивных типов и сложных типов. Все переменные сложных типов -- ССЫЛОЧНЫЕ. Это значит, что внутри переменной НЕ ХРАНИТСЯ объект, в ней хранится только ссылка на объект, а сам объект расположен где-то в другом месте.

Если вы передали в любую функцию такой ссылочный параметр, то любое присваивание этой переменной затрёт старую ссылку новой и не будет заметно в вызывающем модуле, потому что ссылка передаётся ПО ЗНАЧЕНИЮ.

Если Вам нравится делать так, как Вы хотите, то заверните ссылку в другой объект.
PM MAIL   Вверх
Andrey1
Дата 18.4.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 1
Всего: 5



Цитата(Dims @  18.4.2008,  21:24 Найти цитируемый пост)
Кого в этом случае Вы хотите инициализировать?

Хочу инициализировать того, кто передается. 
Хотя, если жестко будет передаваться null, то тогда будет и вправду совсем грустно smile.


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
Dims
Дата 18.4.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



Цитата(Andrey1 @  18.4.2008,  21:38 Найти цитируемый пост)
Хочу инициализировать того, кто передается.


Ну это возможно. Для этого тому объекту надо написать метод "InitializirovatMenia".

null передавать нельзя, null -- это ничто. Некого инициализировать. Сделайте объекту метод "YaPustoi", который возвращает да/нет и проверяйте его.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0821 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.