Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2013, 19:56   #1
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию Странная работа ArrayList

Добрый день. Есть небольшой участок кода :
Код:
Log.d("test","NAME  " + getAction(index_of_set_action).name);
Log.d("test","BEFORE  " + Boolean.toString(getAction(index_of_set_action).enabled));
getAction(index_of_set_action).enabled =  false;
Log.d("test","AFTER  " + Boolean.toString(getAction(index_of_set_action).enabled));
				   
for(int i=0;i<actions.size();i++)
	 Log.d("debug", SPM.manager.getAction(i).name + "  "+Boolean.toString(SPM.manager.getAction(i).enabled));
Где
Код:
private ArrayList<Action> actions;
...
public Action getAction(int pos){
		 Action a ;
		 try{
			 a = actions.get(pos);
		 }catch(IndexOutOfBoundsException e){
			 a = null;
		 }
		 return a;
	 }
Класс Action состоит из нескольких переменных. Больше всего меня волнует переменная enabled и ее изменение. Выполнение первого приведенного кода генерирует такой вывод
Код:
NAME  action
BEFORE  true
AFTER  false
oneaction  false
secondaction  true
action  true
Значит в массиве удачно находится нужный нам объект, в нем изменяется переменная enabled с true на false, а потом в полном переборе этого массива отображается опять значение true. Почему?
Hemul вне форума Ответить с цитированием
Старый 11.04.2013, 20:51   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Так, у меня работает, как нужно, да я и не ожидал ничего другого. Нужен весь код.

Несколько советов:
1. не нужно писать так
Код:
try{
	a = actions.get(pos);
}catch(IndexOutOfBoundsException e){
	 a = null;
}
Исключения медленные. Лучше так
Код:
return (actions.size() <= pos ? null :actions.get(pos));
2. Чтобы булевскую переменную приклеить к строке, достаточно написать:
Код:
"BEFORE  " + getAction(index_of_set_action).enabled

Почему в одном месте кода:
Код:
Log.d("test","NAME  " + getAction(index_of_set_action).name);
А в другом:
Код:
SPM.manager.getAction(i).enabled
?
Рискну предположить, что работа идет совсем с другим списком.

Последний раз редактировалось Carbon; 11.04.2013 в 21:04.
Carbon вне форума Ответить с цитированием
Старый 11.04.2013, 21:06   #3
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Это приложение под андроид, которое по расписанию меняет профили звука.

Класс создается статически
Код:
class SPM {
	static SPMManager manager;
	static {
		manager = new SPMManager();
	}
}
Я думаю, вы правы и я действительно где-то запутался в экземлярах класса. Скажите, это правильный подход создавать класс статически, чтобы иметь доступ к нему из любой части программы и создавать его только один раз в начале, либо это неправильно и есть более красивое решение.

Метод обращения внутри класса к массиву-члену класса
напрямую getAction() и через статический объект SPM.manager.getAction() почему-то возвращают разные массивы. Такое ощущение, что создаеются еще объекты, хотя я создаю только статический

Последний раз редактировалось Hemul; 11.04.2013 в 21:31.
Hemul вне форума Ответить с цитированием
Старый 11.04.2013, 23:42   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Hemul Посмотреть сообщение
Скажите, это правильный подход создавать класс статически, чтобы иметь доступ к нему из любой части программы и создавать его только один раз в начале, либо это неправильно и есть более красивое решение.
Это нормально, только описан этот экземпляр неправильно. Вот сам паттерн

Цитата:
Сообщение от Hemul Посмотреть сообщение
Метод обращения внутри класса к массиву-члену класса
напрямую getAction() и через статический объект SPM.manager.getAction() почему-то возвращают разные массивы. Такое ощущение, что создаеются еще объекты, хотя я создаю только статический
Ну я не удивлен, я вообще сомневаюсь, что работа идет в одной и той же области. И я сразу попросил привести мне весь код.
Carbon вне форума Ответить с цитированием
Старый 12.04.2013, 09:13   #5
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Вот класс целиком. Во всех других частях программы я обращаюсь к нему как SPM.manager. , почему же обращение внутри класса к массиву и обращение через статический объект это обращения к разным массивам?
Вложения
Тип файла: txt SPMManager.txt (14.4 Кб, 154 просмотров)
Hemul вне форума Ответить с цитированием
Старый 12.04.2013, 12:18   #6
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

По-прежнему все работает. Я правда удалил те части, которых у меня нет. Значит портятся данные где-то за пределами класса.
Carbon вне форума Ответить с цитированием
Старый 12.04.2013, 19:00   #7
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Все я разобрался. Оказывается, AlarmManager передт onReceive вызывает конструктор без параметров, а там у меня создавался новый ArrayList.

Последний раз редактировалось Hemul; 12.04.2013 в 22:15.
Hemul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странная работа скрипта The SCS PHP 2 01.07.2012 01:44
ArrayList ISV-777 Общие вопросы по Java, Java SE, Kotlin 2 06.12.2011 20:05
Странная работа маленького потока (пингует IP) TwiX Работа с сетью в Delphi 1 17.09.2010 22:33
странная работа функции strcat() kin63camapa Общие вопросы C/C++ 4 05.04.2010 16:19
Странная работа цикла valerij Microsoft Office Excel 5 06.03.2009 16:40