Приятная, маленькая хитрость массивов.

Ответить
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Приятная, маленькая хитрость массивов.

Сообщение Mikhail_dev » 29 мар 2013, 00:47

На заметку.
Возможно кто-то уже встречался (в андроиде это часто случается) с внутренними, анонимными классами. Пример:

Код: Выделить всё

        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("Выбрать адрес");
        builder.setItems(items, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
            // Что-то делаем.
        });
        AlertDialog alert = builder.create();
        alert.show();
Итак, тут можно лицезреть анонимный класс new DialogInterface.OnClickListener() { ...}
В него мы можем передавать только final переменные. Думаю все с этим встречались. Порой приходится как-то выкручиваться с этим делом. Это бывает редко, но всё же бывает. Тут нам могут помочь обычные массивы. Гляньте разницу

Код: Выделить всё

final int variable = 2;
Мы не сможем её больше изменить

Код: Выделить всё

final int[] massive = new int[1];
А вот тут мы можем менять значение massive[0] сколько угодно.
Суть в том, что final тут идёт на длину массива (которую по дефолту менять нельзя). Поэтому никак не влияет на смену переменных в массиве. Отсюда еще один вывод, что

Код: Выделить всё

final int[] massive = new int[1];
и

Код: Выделить всё

int[] massive = new int[1];
идентичные конструкции.

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

Код: Выделить всё

	private static void getListAdressDialog(final Place[] addresses, final MapActivity mapActivity) { 
		final String[] items = new String[addresses.length];
		final Location currentLocation = mapActivity.getLocation(); 
		for (int i=0;i<addresses.length;++i) {
        	Place r = addresses[i];
        	if (r!=null)
        	    items[i] = "(" + FancyFormatter.distance(r.getLocation().distanceTo(currentLocation)) + ") " + r.getDisplayName();
        	else 
        	    items[i] = "(null)";
        }
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("Выбрать адрес");
        builder.setItems(items, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
           //Какие-то действия
        });
        AlertDialog alert = builder.create();
        alert.show();
	}
Тут шла цепочка диалогов, в которых final только одни и были. Пример не особо удачный, но показывает чуть. В общем случае, мне надо было потом доработать данные строки, данный метод помог.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Приятная, маленькая хитрость массивов.

Сообщение anber » 08 июл 2013, 16:53

Это объяснимо - массив это объект в Java.
In the Java programming language, arrays are objects (§4.3.1), are dynamically created, and may be assigned to variables of type Object (§4.3.2). All methods of class Object may be invoked on an array.
Еще, как вариант, можно объявить объект полем родительского класса.
Вообще передавать таким образом данные в inner class это не самая лучшая идея, см. http://stackoverflow.com/a/4732586/1159507

Также возможна следующая конструкция:

Код: Выделить всё

private void f(Button b, final int a) {
    int value = 5;
    // Some code...
    final int settingValue = value;
    b.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
                int value = settingValue;
        }
    });
}
PS. Возможно стоит изменить название темы на что-то типа "Как изменить final переменную переданную во внутренний анонимный класс?"
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Ответить