Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > При инициализации объекта в методе теряется ссылка |
Автор: Andrey1 17.4.2008, 12:01 | ||
Столкнулся с такой ситуацией... Если в методе инициализировать объект:
и захотеть передать данные в объект myObject через этот метод аля: doSetSomeData(myObject) то, если myObject = null, то данные не передадутся!.. Если - правда, то это как-то скучно... Нада следить, чтобы в методе не вызывалось new для объектов, через которые нада передавать данные... |
Автор: _Y_ 17.4.2008, 12:25 |
Скучнo, конечно, но это именно так. Дело в том, что метод ничего не возвращает по параметрам. В мануалах написано, что обьекты передаются по ссыке и это может быть неправильно понято. Наверное точнее будет сказать, что все параметры передаются методу по значениям, но обьекты можно передавать только передавая значения ссылок на них. Вызов передает методу значение ссылки на обьект класса myClass. Метод new записывает в переменную object новую ссылку. Но переменная object -то видна только внутри метода doSetSomeData, а переманная, содержащая ссылку на исходный обьект (та, что в коде вызвавшем метод doSetSomeData) при этом не изменяется. |
Автор: fixxer 17.4.2008, 12:34 |
И это правильно, потому что я бы не хотел, чтобы любой метод, куда я передаю свой объект мог бы изменить его иначе чем через контракт, который я ему предоставляю. |
Автор: math64 17.4.2008, 12:36 |
Можно защититься от таких ошибок объявляя параметры final - некоторые IDE делают так при создании метода. |
Автор: Dims 18.4.2008, 19:44 |
Что-то я не понял, причём тут null? Данные не передадутся в любом случае, если myObject-у чего-то присваивается. Совершенно неважно, new или не new, и чему была равна переменная до вызова -- если она затёрта, то она не передастся. |
Автор: Andrey1 18.4.2008, 20:26 | ||
Да, все так... Думаю, все друг друга поняли.... Все равно грустно... ![]() Разница в том, что если передаваемый объект = null (что можно было бы использовать как некий флаг...), то этому объекту метод вообще ничего передать не может (ни инициализировать его...). Странно только, действительно, почему все параметры метода в Java не считаются final по умолчанию.... |
Автор: Dims 18.4.2008, 21:24 | ||
Не понял, какому "этому"? Если передаваемая ПЕРЕМЕННАЯ содержит null, то это означает, что НИКАКОГО ОБЪЕКТА нет, она ни на что не ссылается. Кого в этом случае Вы хотите инициализировать? Добавлено через 4 минуты и 55 секунд P.S. В джаве есть два рода переменных: примитивных типов и сложных типов. Все переменные сложных типов -- ССЫЛОЧНЫЕ. Это значит, что внутри переменной НЕ ХРАНИТСЯ объект, в ней хранится только ссылка на объект, а сам объект расположен где-то в другом месте. Если вы передали в любую функцию такой ссылочный параметр, то любое присваивание этой переменной затрёт старую ссылку новой и не будет заметно в вызывающем модуле, потому что ссылка передаётся ПО ЗНАЧЕНИЮ. Если Вам нравится делать так, как Вы хотите, то заверните ссылку в другой объект. |
Автор: Andrey1 18.4.2008, 21:38 |
Хочу инициализировать того, кто передается. Хотя, если жестко будет передаваться null, то тогда будет и вправду совсем грустно ![]() |
Автор: Dims 18.4.2008, 21:47 |
Ну это возможно. Для этого тому объекту надо написать метод "InitializirovatMenia". null передавать нельзя, null -- это ничто. Некого инициализировать. Сделайте объекту метод "YaPustoi", который возвращает да/нет и проверяйте его. |