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

Android - zmienna musi być jako final...?!
Reiko
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 4 lata
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:

Kopiuj
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?

LP
  • Rejestracja:około 7 lat
  • Ostatnio:17 dni
  • Postów:366
1

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

CountZero
  • Rejestracja:ponad 7 lat
  • Ostatnio:11 miesięcy
  • Postów:262
0

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

edytowany 2x, ostatnio: CountZero
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Postów:3561
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".


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 3x, ostatnio: AnyKtokolwiek
CountZero
Racja, edytowałem by nie było nieporozumień
Reiko
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 4 lata
0

Dziękuję za odpowiedzi :)

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około godziny
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.