Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Можно ли передать String по ссылке |
Автор: 3,14 23.8.2007, 12:22 |
По умолчанию объекты типа String передаются по значению. Можно ли как то исхитрится и передать String по ссылке? Пока есть только идея передавать массив стрингов, но это не очень удобно :( Так как в методе меняется всего две переменных... |
Автор: ekr 23.8.2007, 13:00 |
по ссылке они передаются, т.к. это объектный тип, а не примитивный а что сделать-то дальше с ними надо? |
Автор: y3u 23.8.2007, 13:30 |
К тому же есть StringBuilder-ы и StringBuffer-ы... на крайний случай ![]() Не хватает информации о решаемой задачи, чтобы что-то предложить... |
Автор: 3,14 23.8.2007, 13:51 | ||
Не всё так просто. Вот код
На выходе получаем: old value. Те, по сути происходит передача по значению. Задача такая. Функция должна распарсить передаваемую ей строку, и записать результат в две других строки. |
Автор: Shaggie 23.8.2007, 14:10 | ||
|
Автор: goodday1941 23.8.2007, 14:30 | ||||
таки так получаеться интерестно а что будет если написать так:
Добавлено через 10 минут и 57 секунд в общем то результат тот же.. дак почему же не переопределился стринг? |
Автор: y3u 23.8.2007, 14:45 |
ничего не будет ![]() http://java.sun.com/javase/6/docs/api/java/lang/String.html а вот по поводу иммьютабельности строки, вот показательный пример http://skipy.developer.juga.ru/technics/strings.html#mutation но это так, лирика ![]() вообще, как ту правильно заметили, лучше сделать для этого POJO и не париться... |
Автор: fixxer 23.8.2007, 14:47 |
Ничего хорошего. String является immutable. str не изменится, а результат возвратится из метода replace. |
Автор: 3,14 23.8.2007, 14:50 | ||||||
потомучто тогда при каждом вызове ф-ии придётся писать 5 строк вместо 1, что очень не приятно
Да я и так знаю, почему это так работает. Я не могу найти решение к-ое меня бы устраивало. |
Автор: y3u 23.8.2007, 14:53 | ||
ну, привыкай ![]() "здесь Вам не С" (с) ![]() |
Автор: goodday1941 23.8.2007, 14:59 | ||
эта строка мне открыла глаза ![]() а есть где то перечень immutable классов? |
Автор: 3,14 23.8.2007, 15:02 |
Не привык привыкать ![]() ![]() |
Автор: y3u 23.8.2007, 15:42 | ||||
по приколу, с ходу не тестируя, т.ч. не пинайте ![]() ![]()
использование в одну строчку
|
Автор: nornad 24.8.2007, 03:09 | ||||
Что-то не сходится... y3u, что-то я не понял, к чему код... Или ты темой ошибся, или я нить рассуждений потерял... Добавлено через 4 минуты и 22 секунды Мне почему-то кажется, что скорее 3 строки, но в данном случае это не так важно. Передать "по ссылке" можно лишь, если требуемая переменная лежит внутри другого объекта (передаваемого). Или массива. Другого способа нет. Хотя... Если через рефлекшн внаглую попробовать "проломить" безопасную ссылку... Только вот лично я предпочту сделать обёртку. Потому как рефлекшн пользовать не лучшая идея. ![]() |
Автор: y3u 24.8.2007, 08:23 | ||
вот как раз код к этому... |
Автор: 3,14 24.8.2007, 10:16 |
Жесть, меня на сановском форуме все дружно уверяют, что абсолютно все объекты передаются по значению, а не по ссылке. ![]() |
Автор: fixxer 24.8.2007, 10:38 | ||
Да, это действительно так. В случае ссылочной переменной по значению передается ссылка (копируется во фрейм вызова), поэтому и ее нельзя изменить, чтобы изменения были видны во вне метода. |
Автор: ekr 24.8.2007, 11:00 | ||
разница в контексте. дело в том, что действительно, это правда. но когда речь заходит об объектных типах, то по значению передается объектная ссылка, так что получается, что формальный и фактический параметры смотрят на один объект. поэтому можно из метода его менять. получается, что технически по значению, а концептуально по ссылке. во как загнул ) |
Автор: 3,14 24.8.2007, 11:37 |
Я как то првивык разделять объект и ссылку на объект. Всё таки это разные вещи. Объект - это, как известно, экземпляр класса. А ссылка - это всего лишь ссылка ![]() |
Автор: nornad 24.8.2007, 13:50 |
3,14, ну вот, а говорил, что знаешь и понимаешь. ![]() В java все объектные переменные - действительно представлены ссылками. Сами ссылки передаются в методы в безопасном виде, что позволяет получить и изменить данные в объекте по ссылке, но не позволяет изменить саму ссылку. P.S. Блин, на моей памяти уже раз так четвёртый тему мусолим... |
Автор: 3,14 24.8.2007, 14:38 |
nornad, это, знаешь ли, уже вопрос терминилогии. Считать ли пер-ую типа ссылка, передаваемую в метод, объектом. В Java различия между этимми понятиями не делается, но это только в Java. |
Автор: nornad 24.8.2007, 14:55 |
3,14, вот-вот. Ты уже сам ответил на свой вопрос. ![]() Если пишешь на Java, надо придерживаться её идеологии. По идеологии Java всё есть объект (ну, за исключением встроенных типов, конечно). Понятие ссылки в Java вообще отсутствует. И не надо его из С/С++ тянуть - там полного аналога для этого не существует. Нужно просто понять и принять идеологию, а не пытаться притянуть её к другой идеологии, которую ты уже знаешь. |
Автор: 3,14 24.8.2007, 15:18 |
nornad, я на Java пишу гораздо дольше, чем некогда писал на C++. Просто такая идеология куда как удобней когда нужно копатся, напрмер, с байт кодом. |
Автор: AntonSaburov 24.8.2007, 15:34 | ||
Чего-то тут много словов всяких ![]() Да вернуть массив строк и всех делов Вот для примера - разбиавем строку на массив строк - разделителем является символ двоеточия ":"
|
Автор: nornad 24.8.2007, 22:29 |
Ниасилил? ![]() А пример, кстати, хорош - коротко и ясно. Если хочется большего - меняем String на Object и радуемся резко возросшим возможностям. Жаль только, что камраду такой вариант не нравится - не лаконичен, видите ли... Ну, кому что, как говорится. |
Автор: math64 26.8.2007, 01:09 | ||
Если не нравится возвращать массив, то проще этого не придумаешь:
|