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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не работает Player 
:(
    Опции темы
ИванМ
Дата 3.2.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 23



У меня такая проблемма.
Если в конструкторе GameCanvas пишу такой код:

Код

try
{
    plMoney=Manager.createPlayer(getClass().getResourceAsStream("/money.wav"), "audio/x-wav");            
    plMoney.realize();
    plMoney.prefetch();
}
catch(Exception e){}


то все работает.
Но если в этом же самом месте вместо вышеописанного кода вызываю функцию init (этого же класса, GameCanvas):

Код

init(plMoney, "/money.wav");


то не работает.

Функция init выглядит так:

Код

private void init(Player sound, String file)
{        
    try
    {
        sound=Manager.createPlayer(getClass().getResourceAsStream(file), "audio/x-wav");
        sound.realize();
        sound.prefetch();            
    }
    catch(Exception e){}
}


Как такое может быть?
PM MAIL   Вверх
ИванМ
Дата 3.2.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 23



Нашел причину. Оказывается в java параметры передаются по значению а не по ссылке. А как передать по ссылке? Нет ключевого слова ref как в C# или наподобии того?
PM MAIL   Вверх
kemiisto
Дата 4.2.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



Цитата(ИванМ @  3.2.2009,  21:17 Найти цитируемый пост)
Нашел причину. Оказывается в java параметры передаются по значению, а не по ссылке.

При этом не надо забывать, что по значению передаётся ссылка (object reference). Если параметр является изменяемым (mutable) объектом, то в теле метода можно изменять состояние. И будет изменяться состояние переданного объекта. То есть создаётся копия ссылки на объект, а не копия объекта. Есть, конечно, и immutable objects - это то, что в других языках относится к примитивным типам (int, double). Они всегда передаются по значению. 

Так что Ваш пример, теоретически должен работать. Такой вывод из того, что я вижу. 

P.S. Могу заблуждаться.  smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
ИванМ
Дата 4.2.2009, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 23



Я прочитал, что вроде можно изменять состояние, но нельзя присваивать объекту новую копию.
Т.е.
object.value=n и object.setN(val) будет работать
а
object = new ... не будет

А в моем случае как раз второе.
PM MAIL   Вверх
kemiisto
Дата 4.2.2009, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



Цитата(ИванМ @  3.2.2009,  22:24 Найти цитируемый пост)
Я прочитал, что вроде можно изменять состояние, но нельзя присваивать объекту новую копию.

Ну да, ну да. Я был невнимателен. Тогда сделайте так - метод должен вернуть ссылку на созданный внутри него экземпляр класса Player:
Код

private Player init(String file)
{      
    Player sound=Manager.createPlayer(getClass().getResourceAsStream(file), "audio/x-wav");
    sound.realize();
    sound.prefetch();            
    return sound;
}

и вызов соответсвенно (я не особо соображаю в обработке исключений, но я try-catch переместил бы сюда):
Код

try
{
    plMoney = init("/money.wav");
}
catch(Exception e){}


P.S. Пишу "на коленках", так что работоспособность не гарантирую. smile 

Это сообщение отредактировал(а) kemiisto - 4.2.2009, 00:46


--------------------
PM MAIL WWW GTalk Jabber   Вверх
ИванМ
Дата 4.2.2009, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 23



Спасибо. Это тоже выход.
PM MAIL   Вверх
math64
Дата 4.2.2009, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если нужно передать несколько значений по ссылке, можно сделать так:
Код

class RefPlayer {
public Player player;
public RefPlayer(Player player) {this.player = player}
}

void init(RefPlayer rplayer, String file) {
Player player = rplayer.player;

rplayer.player = player;
}

RefPlayer rplayer = new RefPlayer(plMoney);
init(rplayer,"/money.wav");
plMoney = rplayer.player;

Но в данном случае (с одним ref-параметром) лучше код kemiisto.

Это сообщение отредактировал(а) math64 - 4.2.2009, 10:53
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




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


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

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