Здравствуйте, fellow.sufferer, Вы писали:
FS>Здравствуйте, aka50, Вы писали:
A>>Правильное слово будет "изменил", и тогда становится понятно что A>>есть "примитивный" указатель... он в кавычках, т.к. что int, что A>>ссылка передаются по значению...
FS>Ну так чем же "примитивный" указатель отличается от указателя?
В том, что (ну и например при ==) ведет себя как
любой примитивный тип (примерно как int).
Re[15]: передача параметра "по ссылке"
От:
Аноним
Дата:
21.12.06 09:54
Оценка:
Тебе не проще в спеке поискать ответ?
Или те прост ов кайф вопросы задавать?
Здравствуйте, dev_m, Вы писали:
_>Я так понимаю я не понял самой сути проблемы. Читая посты у меня сложилось впечатление что мое желание вообще с точки зрения java неправильно. Если так, то не могли бы вы мне объяснить почему...
Вот именно. Прочтите сообщение Re[6]: передача параметра "по ссылке"
Здравствуйте, aka50, Вы писали:
FS>>Ну так чем же "примитивный" указатель отличается от указателя?
A>В том, что (ну и например при ==) ведет себя как A>любой примитивный тип (примерно как int).
То есть "примитивный" указатель ведёт себя как int, а указатель как кто себя ведёт?)))
Здравствуйте, Тычеблин, Вы писали:
Т>Здравствуйте, dev_m, Вы писали:
_>>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу. _>>В сях: _>>
_>>void set(int&n);
_>>
_>> , а как в jave?
Т>это к стати то — чего ужас как нехватает в JAVA... Т>это первое — что нужно было добавить в язык.
Это неудобство проявляется в основном при математических вычислениях, при попытке использования процедурного подхода в Java (через статические методы к примеру). Не помню, чтобы мне это где-то еще могло пригодиться, но я особо по этому поводу не расстраивался.
Здравствуйте, dev_m, Вы писали:
А>>Обворачивай в объект и вперёд. Или ретурнь результат. Это уж от как красифше по задаче будет ) _>Return не покатит, так как возвращаемый параметр не один, ну разве хоть массив несвязаных параметров возвращай.
Не понял... ведь если ты передаешь ссылку на объект, внутри функции ты этот объект можешь менять (
блин, чего вот в жаве нет, так это старого доброго const )
Если ты оперируешь примитивными типами... тут действительно overhead, ибо придется извращаться...
_>Я тут привел код, который написал прямо в ответнике, чтобы иллюстрировать свою проблему — не знание, как получить объект/обычную переменную из функции(чем я раньше регулярно пользовался в с++), кроме как через return. Насчет того, что n должно быть полем класса — ну, в данный момент я хочу изменять и получать состояния вообще другого класса...
А почему у другого класса не сделать пропертю типа getMySuperState1, getMySuperState2? Есть большая вероятность inline jit-ом,
что уберет вызовы функции вообще?
_>Я так понимаю я не понял самой сути проблемы. Читая посты у меня сложилось впечатление что мое желание вообще с точки зрения java неправильно. Если так, то не могли бы вы мне объяснить почему...
В java все есть объект, и нужно привыкнуть к тому, что все простые операции типа =, == оперируют над простыми типами
и ссылками на объекты (т.е. new Integer(1) != new Integer(1), т.к. это два разных объекта, правильно
new Integer(1).equals(new Integer(1)).
По этому если тебе страсть как надо передать объект для модификации придется либо поступить
правильно, т.е. вернуть новое значение (n = someFunction(n)) либо обернуть это дело в объект
(типа класса Test выше), либо изспользовать массив (изврат) int [] = new int[1] = {1};
Здравствуйте, fellow.sufferer, Вы писали:
FS>Здравствуйте, aka50, Вы писали:
FS>>>Ну так чем же "примитивный" указатель отличается от указателя?
A>>В том, что (ну и например при ==) ведет себя как A>>любой примитивный тип (примерно как int).
FS>То есть "примитивный" указатель ведёт себя как int, а указатель как кто себя ведёт?)))
"Поздравляю Шарик — ты балбес" (с) Матроскин
примитивный... ну если тебе легче, есть еще weak .
T>Это неудобство проявляется в основном при математических вычислениях, при попытке использования процедурного подхода в Java (через статические методы к примеру). Не помню, чтобы мне это где-то еще могло пригодиться, но я особо по этому поводу не расстраивался.
до момента переписывания кода под C# я тоже особенно — то и не перживал относясь к этой проблемме как к явлению природы...
если аквариумных рыбок вылить в пруд они еще долго будут плавать в периметре уже отсутствующего аквариума...
так и я, начав переписывать код, некоторое время, делал это в стиле JAVA ...
прозрение наступило позже...
одним словом, это нужно реально ощутить на практике.
уверяю, контраст разительный.
и дело не только в примитивах. считаю возможность передавать ЛЮБЫЕ переменные byref важнее и полезне чем дженерики.
Здравствуйте, aka50, Вы писали:
A>примитивный... ну если тебе легче, есть еще weak .
А ты можешь просто ответить на вопрос, который сам же и вызвал введением новых терминов?
Как же себя ведет при сравнении (==) "не_примитивный" указатель, если "примитивный" ведет себя как int?
Здравствуйте, aka50, Вы писали:
A>Здравствуйте, dev_m, Вы писали:
А>>>Обворачивай в объект и вперёд. Или ретурнь результат. Это уж от как красифше по задаче будет ) _>>Return не покатит, так как возвращаемый параметр не один, ну разве хоть массив несвязаных параметров возвращай. A>Не понял... ведь если ты передаешь ссылку на объект, внутри функции ты этот объект можешь менять ( A>блин, чего вот в жаве нет, так это старого доброго const )
А в чем проблема сделать интерфейс только с get методами, типа:
Здравствуйте, aka50, Вы писали:
A>"Поздравляю Шарик — ты балбес" (с) Матроскин
Зарываешься.
A>примитивный... ну если тебе легче, есть еще weak .
Ок. Есть Weak, Soft, Strong, Phantom. "Примитивный" это какой?
Здравствуйте, Тычеблин, Вы писали:
Т>Здравствуйте, Trean, Вы писали:
T>>Это неудобство проявляется в основном при математических вычислениях, при попытке использования процедурного подхода в Java (через статические методы к примеру). Не помню, чтобы мне это где-то еще могло пригодиться, но я особо по этому поводу не расстраивался.
Т>до момента переписывания кода под C# я тоже особенно — то и не перживал относясь к этой проблемме как к явлению природы...
Т>если аквариумных рыбок вылить в пруд они еще долго будут плавать в периметре уже отсутствующего аквариума...
Я на C/C++ писал в открытом море, и когда, если следовать вашей аналогии меня засунули в аквариум, я даже не расстроился потери int& или int*.
Т>так и я, начав переписывать код, некоторое время, делал это в стиле JAVA ... Т>прозрение наступило позже... Т>одним словом, это нужно реально ощутить на практике. Т>уверяю, контраст разительный. Т>и дело не только в примитивах. считаю возможность передавать ЛЮБЫЕ переменные byref важнее и полезне чем дженерики.
Гм, позвольте, а где в java проблема с передачей изменяемых в методе объектов? Это только к примитивам относится, или вы хотите чтобы еще и значение передаваемой ссылки на объект можно было менять? Так это такие баги в программе будут, что лучше сразу выпить яду. Буду рад если вы приведете кусочек кода, после которого у меня наступит прозрение чтобы понять, что я теряю сейчас.
Здравствуйте, dev_m, Вы писали:
А>>Обворачивай в объект и вперёд. Или ретурнь результат. Это уж от как красифше по задаче будет ) _>Return не покатит, так как возвращаемый параметр не один, ну разве хоть массив несвязаных параметров возвращай.
_>Как его в объект обернуть, так чтобы помогло я не понял. У меня пример с Integer тоже не работает. _>Насчет обсуждений о правильности с точки зрения ООП, обсуждаемой ниже. _>Я тут привел код, который написал прямо в ответнике, чтобы иллюстрировать свою проблему — не знание, как получить объект/обычную переменную из функции(чем я раньше регулярно пользовался в с++), кроме как через return. Насчет того, что n должно быть полем класса — ну, в данный момент я хочу изменять и получать состояния вообще другого класса... _>Да, горячая получилось темка, совсем не ожидал.... _>Я так понимаю я не понял самой сути проблемы. Читая посты у меня сложилось впечатление что мое желание вообще с точки зрения java неправильно. Если так, то не могли бы вы мне объяснить почему...
Тут уже так много объясняли, что я даже боюсь начинать!
почему Ваше желание неправильно я не знаю
есть примитивные типы, а есть классы-обёртки примитивных типов
в Java есть передача параметров только по значению
отсюда вытекает, что если использовать примитивный тип как параметр, то внутри него используется его локальная копия.
а вот если передавать ссылку (копия ссылки!) на объект с полем типа int это пожалуйста
как я узнал от fellow.sufferer с обёртками примитивных типов фича с передачей ссылки не прокатит
Если очень хочется можно создать свой класс обёртку (чтоб и в Java 1.4 и 1.5 прокатило, в 1.5 работает точно ):
public class MyIntWrapper
{
private int intTypeField;
public MyIntWrapper() {}
public MyIntWrapper(int intTypeParam)
{
this.intTypeField = intTypeParam;
}
public void setInt(int intTypeParam)
{
this.intTypeField = intTypeParam;
}
public int getInt()
{
return this.intTypeField;
}
}
public class Test1
{
public static void change(MyIntWrapper n)
{
n.setInt(5);
}
public static void main(String[] args)
{
MyIntWrapper n = new MyIntWrapper();
System.out.println(n.getInt());
change(n);
System.out.println(n.getInt());
}
}
D>Добавлю еще один вариант: в jakarta commons-lang есть Mutable типы Class MutableInt. Можно использовать их.
можно, верно. а для чего такие страдания? берем в руки C# и смотрим насколько все оказываца может проще и понятнее.
не нужно плодить разнообразные холдеры — откровенно загаживающие код при программировании и просаживающие производительность, и отъедающие память при инстанционировании в рантайме.
было бы понятно если бы добавление возможности передачи параметров byref было бы чем либо невероятно сложным, но в C# сделали ведь.
прошу обратить внимание, что передачи параметров byref дает возможность изменять не только внешние примитивные типы но и ССЫЛОЧНЫЕ.
(ссылка в сообщении)
Т>скажу мягко...это утверждение несоответствует действительности
Скажу твердо: RTFM! В рамках ООП — соответствует. Конечно, если вы пишете процедурно, то...