Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / static class / 9 сообщений из 9, страница 1 из 1
10.07.2012, 11:53:58
    #37872894
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
static class
Добрый день!
Нужно создать класс - хранитель статических данных(массив)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public class filterList {
	static private ArrayList<filterItem> mList = //new ArrayList<filterItem>();
			(ArrayList<filterItem>) Arrays.asList(
					new filterItem(R.id.call_out, "is_show_call_out", R.drawable.call_out_connected, R.drawable.call_out_disabled),
					new filterItem(R.id.call_in, "is_show_call_in", R.drawable.call_in_connected, R.drawable.call_in_disabled),
                                        ........)
				);
	
	static public int size()	{
		return	mList.size();
	}
	
	static public filterItem get(int index)	{
		return	mList.get(index);
	}
	
	static public filterItem get(String name)	{
		for(int i=0; i<mList.size(); i++)	
			if (mList.get(i).key.equals(name))	{
				return	mList.get(i);
			}
		return	null;
	}
	
	private	filterList()	{
		// set that class do not have constructor: this is static class
	}
}


Данная реализация вызывает exception -
W/System.err(8275): java.lang.ExceptionInInitializerError

Реализация
Код: java
1.
2.
3.
4.
5.
	static private ArrayList<filterItem> mList = new ArrayList<filterItem>();
        {
            mList.add( ... )
            ....
        }



Ошибок не вызывает, но mList.size()==0 ?
Помогите.

С Уважением, Александр
...
Рейтинг: 0 / 0
10.07.2012, 11:59:30
    #37872902
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
static class
Сам себе отвечаю:
Код: java
1.
2.
3.
4.
5.
6.
7.
	static private ArrayList<filterItem> mList = //new ArrayList<filterItem>();
			new ArrayList<filterItem>(
					java.util.Arrays.<filterItem>asList(
					new filterItem(R.id.call_out, "is_show_call_out", R.drawable.call_out_connected, R.drawable.call_out_disabled),
					.........
							)
					);


Работает.
Вопрос почему не работает через инициализацию в {} ??
...
Рейтинг: 0 / 0
10.07.2012, 12:04:39
    #37872915
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
static class
Чтобы понимать ошибку надо читать весь stacktrace, а не только окончательно сообщение.
Вероятно Arrays.asList возвращает не ArrayList, а другую реализацию.
Зачем вам поле конкретного типа ArrayList, если можно использовать общий тип List и не зависеть от реализации.
В реализации с безымянным конструктором вы забыли указать ключевое слово static. Поэтом ваш блок инициализации оказался не статическим и срабатывает только при создании экземпляра. Этот способ более или менее нормальный.

Есть ещё финт с двумя скобками, но со своими побочными эффектами.

Код: java
1.
2.
3.
4.
5.
6.
new ArrayList(){{
  add(value1);
  add(value2);
  add(value3);
  add(value4);
}}
...
Рейтинг: 0 / 0
10.07.2012, 12:06:14
    #37872918
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
static class
LisichkinСам себе отвечаю:
Код: java
1.
2.
3.
4.
5.
6.
7.
	static private ArrayList<filterItem> mList = //new ArrayList<filterItem>();
			new ArrayList<filterItem>(
					java.util.Arrays.<filterItem>asList(
					new filterItem(R.id.call_out, "is_show_call_out", R.drawable.call_out_connected, R.drawable.call_out_disabled),
					.........
							)
					);


Работает.
Вопрос почему не работает через инициализацию в {} ??

А вот так будет ещё проще
Код: java
1.
2.
3.
static private List<filterItem> mList =  java.util.Arrays.<filterItem>asList(
					new filterItem(R.id.call_out, "is_show_call_out", R.drawable.call_out_connected, drawable.call_out_disabled),
					.........							));
...
Рейтинг: 0 / 0
10.07.2012, 12:07:45
    #37872923
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
static class
В гуаве, вроде, ещё полезные заготовки есть:
http://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained
...
Рейтинг: 0 / 0
10.07.2012, 12:08:38
    #37872925
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
static class
Соглашение об именовании у вас специально своё собственное, а не общепринятое? Это ещё небось и андроид?
...
Рейтинг: 0 / 0
10.07.2012, 12:23:30
    #37872944
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
static class
Спасибо!
Использовал предложение Blazkowicz
Код: java
1.
2.
3.
4.
static private List<filterItem> mList =  java.util.Arrays.<filterItem>asList(
					new filterItem(R.id.call_out, "is_show_call_out", R.drawable.call_out_connected, drawable.call_out_disabled),
					.........			
				);



Да, это андроид.
P.S. А вариант с двумя скобками я еще раньше пробовал - не получилось скомпилировать - то ли я не умею "готовить", то ли в android java это нельзя ...
...
Рейтинг: 0 / 0
10.07.2012, 14:32:30
    #37873272
maxkar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
static class
Lisichkin,

В инициализации инициализатор должен быть статическим:
Код: sql
1.
2.
3.
4.
5.
static private ArrayList<filterItem> mList = new ArrayList<filterItem>();
static { //!!!!
  mList.add( ... )
  ....
}



Без статика инициализатор вызывается при создании экземпляра класса, как часть конструктора.
...
Рейтинг: 0 / 0
10.07.2012, 14:44:17
    #37873296
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
static class
BlazkowiczЕсть ещё финт с двумя скобками, но со своими побочными эффектами.

Код: java
1.
2.
3.
4.
5.
6.
new ArrayList(){{
  add(value1);
  add(value2);
  add(value3);
  add(value4);
}}


ага, однажды наткнулся. Может есть ещё какие-то побочные эффекты, помимо этого?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
import java.util.ArrayList;
import java.util.List;

public class Test2 {

    public static void main(String[] args) {

        List<Integer> l = new ArrayList<Integer>() { // анонимный класс
            { // конструктор по-умолчанию
                add(1);
                add(2);
            }
        };
        
        // на выходе не экземпляр ArrayList а его анонимный наследник
        
        System.out.println(l.getClass());
        
    }
    
}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / static class / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]