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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли передать String по ссылке 
:(
    Опции темы
3,14
Дата 23.8.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



По умолчанию объекты типа String передаются по значению. Можно ли как то исхитрится и передать String по ссылке?
Пока есть только идея передавать массив стрингов, но это не очень удобно :( Так как в методе меняется всего две переменных...


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ekr
Дата 23.8.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


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

Репутация: 3
Всего: 19



Цитата(3 @ 14, 23.8.2007,  12:22 Найти цитируемый пост)
По умолчанию объекты типа String передаются по значению.

по ссылке они передаются, т.к. это объектный тип, а не примитивный

а что сделать-то дальше с ними надо?


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
y3u
Дата 23.8.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



К тому же есть StringBuilder-ы и StringBuffer-ы... на крайний случай smile
Не хватает информации о решаемой задачи, чтобы что-то предложить...


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
3,14
Дата 23.8.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(ekr @  23.8.2007,  13:00 Найти цитируемый пост)
по ссылке они передаются, т.к. это объектный тип, а не примитивный

Не всё так просто. Вот код
Код

public class Test
{
    public static void testString(String str) {
        str = "new value";
    }
    public static void main(String[] args) {
        String str = "old value";
        testString(str);
        System.out.println(str);
    }
}

На выходе получаем: old value. Те, по сути происходит передача по значению.
Цитата(y3u @  23.8.2007,  13:30 Найти цитируемый пост)
Не хватает информации о решаемой задачи, чтобы что-то предложить...

Задача такая. Функция должна распарсить передаваемую ей строку, и записать результат в две других строки.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Shaggie
Дата 23.8.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

public class Test
{
    public static String testString(String str) {
        str = "new value";
        return str;
    }
    public static void main(String[] args) {
        String str = "old value";
        str=testString(str);
        System.out.println(str);
    }
}



--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
nornad
Дата 23.8.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 16
Всего: 31



Shaggie, это не поможет:
Цитата(3 @ 14, 23.8.2007,  16:51 Найти цитируемый пост)
Функция должна распарсить передаваемую ей строку, и записать результат в две других строки. 

Приведённый пример проще поставленной задачи.

3,14, а кто мешает сделать свой объект, который будет содержать две строки? И его уже передавать функции. Она в этом случае без проблем изменить содержимое строк.
Ну или тот же массив передавать, но это скорее сишный стиль, чем жабовский.

Кстати, о передаче по ссылке и значению в java уже немало сказано на этом форуме. Поищи и почитай - полезно. Поймёшь, почему у тебя передалось "по значению".  smile 


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
goodday1941
Дата 23.8.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(3 @ 14, 23.8.2007,  13:51 Найти цитируемый пост)
На выходе получаем: old value. Те, по сути происходит передача по значению.

таки так получаеться 

интерестно а что будет если написать так:

Код

public class Test
{
    public static void testString(String str) {
        str.replace(str, "new value");
    }
    public static void main(String[] args) {
        String str = "old value";
        testString(str);
        System.out.println(str);
    }

}


Добавлено через 10 минут и 57 секунд
в общем то результат тот же.. дак почему же не переопределился стринг?


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
y3u
Дата 23.8.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(goodday1941 @  23.8.2007,  15:30 Найти цитируемый пост)
интерестно а что будет если написать так:


ничего не будет smile 

http://java.sun.com/javase/6/docs/api/java/lang/String.html

а вот по поводу иммьютабельности строки, вот показательный пример

http://skipy.developer.juga.ru/technics/st...s.html#mutation

но это так, лирика smile

вообще, как ту правильно заметили, лучше сделать для этого POJO и не париться...

Это сообщение отредактировал(а) y3u - 23.8.2007, 14:48


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
fixxer
Дата 23.8.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ничего хорошего. String является immutable. str не изменится, а результат возвратится из метода replace.


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


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(nornad @  23.8.2007,  14:28 Найти цитируемый пост)
3,14, а кто мешает сделать свой объект, который будет содержать две строки?

Цитата(nornad @  23.8.2007,  14:28 Найти цитируемый пост)
Ну или тот же массив передавать, но это скорее сишный стиль, чем жабовский.

потомучто тогда при каждом вызове ф-ии придётся писать 5 строк вместо 1, что очень не приятно

Цитата(nornad @  23.8.2007,  14:28 Найти цитируемый пост)
Кстати, о передаче по ссылке и значению в java уже немало сказано на этом форуме. Поищи и почитай - полезно.

Да я и так знаю, почему это так работает. Я не могу найти решение к-ое меня бы устраивало.





--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
y3u
Дата 23.8.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(3 @ 14, 23.8.2007,  15:50 Найти цитируемый пост)
потомучто тогда при каждом вызове ф-ии придётся писать 5 строк вместо 1, что очень не приятно


ну, привыкай smile 

"здесь Вам не С" (с) smile


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
goodday1941
Дата 23.8.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(fixxer @  23.8.2007,  14:47 Найти цитируемый пост)
Ничего хорошего. String является immutable. str не изменится, а результат возвратится из метода replace.

эта строка мне открыла глаза  smile 

а есть где то перечень immutable классов?


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
3,14
Дата 23.8.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(y3u @  23.8.2007,  14:53 Найти цитируемый пост)
ну, привыкай smile 

Не привык привыкать smile Привык находить более хорошие решения smile


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
y3u
Дата 23.8.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



по приколу, с ходу не тестируя, т.ч. не пинайте smile Тут, по хорошему, Strategy pattern нужен вместо Factory smile

Код

public interface StringParserResult() {
    String[] getResults();
}

public final class MyStringParserResults() implements StringParserResults {
    private Collection<String> results = new ArrayList<String>();

    public MyStringParserResults() {}

    public MyStringParserResults(String[] results) {
          this.results.addAll(Arrays.asList(results));
    }

    public void addString(String result) {
        results.add(result);  
    }

    public String[] getResults() {
        return results.toArray(new String[results.size()]);
    }
}

public interface StringParser() {
   StringParserResult parse(String src);
}

public final class MyStringParser() {
    private StringParserResult results;

    public StringParserResult parse(String src) {
        return new StringParserResult(src.split("myRegExp"));
    }
}

public final class StringParserFactory() {
    private StringParserFactory(){}

    public static StringParser createStringParser() {
        return new MyStringParser();
    } 
}


использование в одну строчку

Код

    StringParserFactory.createStringParser().parse("asdasdasd");


Это сообщение отредактировал(а) y3u - 23.8.2007, 16:02


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
nornad
Дата 24.8.2007, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 16
Всего: 31



Цитата(3 @ 14, 23.8.2007,  15:22 Найти цитируемый пост)
По умолчанию объекты типа String передаются по значению. Можно ли как то исхитрится и передать String по ссылке?


Цитата(3 @ 14, 23.8.2007,  17:50 Найти цитируемый пост)
Цитата(nornad @  23.8.2007,  14:28 Найти цитируемый пост)
Кстати, о передаче по ссылке и значению в java уже немало сказано на этом форуме. Поищи и почитай - полезно.

Да я и так знаю, почему это так работает. Я не могу найти решение к-ое меня бы устраивало.

Что-то не сходится...


y3u, что-то я не понял, к чему код... Или ты темой ошибся, или я нить рассуждений потерял...

Добавлено через 4 минуты и 22 секунды
Цитата(3 @ 14, 23.8.2007,  17:50 Найти цитируемый пост)
придётся писать 5 строк вместо 1

Мне почему-то кажется, что скорее 3 строки, но в данном случае это не так важно.
Передать "по ссылке" можно лишь, если требуемая переменная лежит внутри другого объекта (передаваемого). Или массива. Другого способа нет.
Хотя... Если через рефлекшн внаглую попробовать "проломить" безопасную ссылку...
Только вот лично я предпочту сделать обёртку. Потому как рефлекшн пользовать не лучшая идея. smile 


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

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

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


 




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


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

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