Android - zmienna musi być jako final...?!

0

Witam,

pisałem sobie z nudów w pociągu prosty program na telefonie którego zadaniem ma być zmiana textView po kliknięciu na przycisk. Oto kod:

package com.mycompany.myapp;

import android.app.*;
import android.os.*;

import android.widget.Button;
import android.view.View;
import android.widget.*;

public class MainActivity extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
		int i = 0;
		
		Button przycisk = (Button) findViewById(R.id.przycisk);
		final TextView label = (TextView) findViewById(R.id.tekst);
		
		przycisk.setOnClickListener(new View.OnClickListener()
		{
			@Override
			public void onClick(View view)
			{
				label.setText("Kliknales: " + Byte.toString(i) + " razy!");
				i = i + 1;
			}
		});
		
    }
}

Problem w tym, że pokazuje mi błąd i wymusza aby zmienna i była zadeklarowana jako final. Ale nie mogę tego zrobić bo ona ma służyć do zwiększania się o 1 po kliknięciu na przycisk. O co chodzi?

1

Szybka odpowiedz: zakres zmiennych. Przenieś zmienna i z zakresu metody onCreate do ciała activity.

0

A o to chodzi, że w klasie anonimowej nie możesz zmieniać zmiennych zadeklarowanych poza nią, muszą być effective final.

0
CountZero napisał(a):

A o to chodzi, że zmienne w klasach anonimowych muszą być effective final.

Nieco spłyciłeś.
Zmienne zewnętrzne w stosunku do klas anonimowych muszą być efetively final. Akurat pole klasy anonimowej nie musi być. Rzadko się widzi tę konstrukcję, bo i rzadko ma sens, ale jest legalna.

To można zrozumieć na chłopski rozum (przyznam się, nie od razu zobaczyłem sens). W chwili gdy zdarzenie jest odpalane (metoda klasy anonimowej) kontekst już jest nie istniejący jak w tu OnCreate / listener, albo nie-wiadomo-jaki. Final powoduje, że kompilator może podać z kontekstu do metody klasy anonimowej 'zdjęcie migawkowe' zmiennych. Chyba (?) nie pomylę się dużo, jeśli powiem "jak niewidzialny parametr konstruktora klasy".

0

Dziękuję za odpowiedzi :)

1

Klasa anonimowa jest domknięciem, a w Javie domykać się można tylko na finalnych (w Javie 8+ effective final) zmiennych lokalnych. Ponadto mamy normalny dostęp do metod i pól klasy otaczającej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1