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 :smile:

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 :smile:

2 Likes

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:

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?