![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Andrey1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 621 Регистрация: 27.2.2004 Где: Moscow Репутация: 1 Всего: 5 |
Столкнулся с такой ситуацией...
Если в методе инициализировать объект:
и захотеть передать данные в объект myObject через этот метод аля: doSetSomeData(myObject) то, если myObject = null, то данные не передадутся!.. Если - правда, то это как-то скучно... Нада следить, чтобы в методе не вызывалось new для объектов, через которые нада передавать данные... Это сообщение отредактировал(а) Andrey1 - 17.4.2008, 12:05 -------------------- Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания. из сутры помоста шестого патриарха Хуэйнена |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Скучнo, конечно, но это именно так.
Дело в том, что метод ничего не возвращает по параметрам. В мануалах написано, что обьекты передаются по ссыке и это может быть неправильно понято. Наверное точнее будет сказать, что все параметры передаются методу по значениям, но обьекты можно передавать только передавая значения ссылок на них. Вызов передает методу значение ссылки на обьект класса myClass. Метод new записывает в переменную object новую ссылку. Но переменная object -то видна только внутри метода doSetSomeData, а переманная, содержащая ссылку на исходный обьект (та, что в коде вызвавшем метод doSetSomeData) при этом не изменяется. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
fixxer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 14.9.2006 Где: Саратов, Россия Репутация: 6 Всего: 27 |
И это правильно, потому что я бы не хотел, чтобы любой метод, куда я передаю свой объект мог бы изменить его иначе чем через контракт, который я ему предоставляю.
-------------------- ![]() |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Можно защититься от таких ошибок объявляя параметры final - некоторые IDE делают так при создании метода.
|
|||
|
||||
Andrey1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 621 Регистрация: 27.2.2004 Где: Moscow Репутация: 1 Всего: 5 |
Да, в такой интерпретации что-то хорошее есть ![]() -------------------- Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания. из сутры помоста шестого патриарха Хуэйнена |
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Что-то я не понял, причём тут null? Данные не передадутся в любом случае, если myObject-у чего-то присваивается. Совершенно неважно, new или не new, и чему была равна переменная до вызова -- если она затёрта, то она не передастся. |
|||
|
||||
Andrey1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 621 Регистрация: 27.2.2004 Где: Moscow Репутация: 1 Всего: 5 |
Да, все так... Думаю, все друг друга поняли.... Все равно грустно... ![]() Разница в том, что если передаваемый объект = null (что можно было бы использовать как некий флаг...), то этому объекту метод вообще ничего передать не может (ни инициализировать его...). Странно только, действительно, почему все параметры метода в Java не считаются final по умолчанию.... Это сообщение отредактировал(а) Andrey1 - 18.4.2008, 20:38 -------------------- Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания. из сутры помоста шестого патриарха Хуэйнена |
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Не понял, какому "этому"? Если передаваемая ПЕРЕМЕННАЯ содержит null, то это означает, что НИКАКОГО ОБЪЕКТА нет, она ни на что не ссылается. Кого в этом случае Вы хотите инициализировать? Добавлено через 4 минуты и 55 секунд P.S. В джаве есть два рода переменных: примитивных типов и сложных типов. Все переменные сложных типов -- ССЫЛОЧНЫЕ. Это значит, что внутри переменной НЕ ХРАНИТСЯ объект, в ней хранится только ссылка на объект, а сам объект расположен где-то в другом месте. Если вы передали в любую функцию такой ссылочный параметр, то любое присваивание этой переменной затрёт старую ссылку новой и не будет заметно в вызывающем модуле, потому что ссылка передаётся ПО ЗНАЧЕНИЮ. Если Вам нравится делать так, как Вы хотите, то заверните ссылку в другой объект. |
|||
|
||||
Andrey1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 621 Регистрация: 27.2.2004 Где: Moscow Репутация: 1 Всего: 5 |
Хочу инициализировать того, кто передается. Хотя, если жестко будет передаваться null, то тогда будет и вправду совсем грустно ![]() -------------------- Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания. из сутры помоста шестого патриарха Хуэйнена |
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Ну это возможно. Для этого тому объекту надо написать метод "InitializirovatMenia". null передавать нельзя, null -- это ничто. Некого инициализировать. Сделайте объекту метод "YaPustoi", который возвращает да/нет и проверяйте его. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |