30/09/2018, 17:40

Tại sao trong Android phải khai báo final cho biến local khi truy cập từ inner class?

Em có code đếm thời gian như thế này

public void onClickStart(View view) {

    final TextView tvTime = (TextView) findViewById(R.id.tvTime);
    final Handler handler = new Handler();


    handler.post(new Runnable() {
        @Override
        public void run() {

            int hour = seconds / 3600;
            int minute = (seconds % 3600) / 60;
            int second = seconds % 3600;
            String time = String.format("%d:%02d:%02d", hour, minute, second);
            tvTime.setText(time);
            seconds++;
            handler.postDelayed(this, 1000);
        }

    });

}

Nếu bỏ final ở dòng final TextView tvTime = (TextView) findViewById(R.id.tvTime); thì sẽ bị báo lỗi local variable tvTime is accessed from within inner class; needs to be declared final ở dòng tvTime.setText(time);. Nhưng nếu em đưa tvTime ra ngoài làm biến Global thì lại không cần final nữa

Quân viết 19:50 ngày 30/09/2018

Class mà bạn nói nó không phải là inner class mà là class vô danh (anonymous).

Đại loại là các biến sử dụng trong anonymous đều sẽ bị làm sạch (xóa bỏ) khi kết thúc, vì vậy sẽ nguy hiểm khi dùng biến không final trong này do có thể làm phá huỷ, thay đổi nó.

Bạn đọc thêm ở đây:

stackoverflow.com
Ankur

Cannot refer to a non-final variable inside an inner class defined in a different method

java, methods, declaration, final
asked by Ankur on 01:12PM - 19 Aug 09
Bài liên quan
0