Как я могу увеличить конечную целочисленную переменную? - PullRequest
3 голосов
/ 14 июня 2011

Eclipse предлагает final, но я не могу увеличить переменную i.

@Override
public void onClick(View v) {
    final TextView tv = (TextView) findViewById(R.id.tvSayac);

    int i = 1;
    do {
        try {
            new Thread(new Runnable() {
                public void run() {
                    tv.post(new Runnable() {
                        public void run() {
                            tv.setText(Integer.toString(i));
                        }
                    });
                }
            });
            i++;
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (i < 16);
}

enter image description here

Ответы [ 6 ]

6 голосов
/ 14 июня 2011

Финал - это объект, который нельзя изменить после инициализации.

Финал (Java)

Что вы можете сделать, это создать переменную внутри области действия цикла do / while, которая является конечной со значением i, и отправить ее в функцию.

5 голосов
/ 04 июля 2014

Самое простое решение здесь - создать класс:

public class FinalCounter {

    private int val;

    public FinalCounter(int intialVal) {
        val=intialVal;
    }
    public void increment(){
        val++;
    }
    public void decrement(){
        val--;
    }
    public int getVal(){
        return val;
    }

    public static void main(String[] arg){
        final FinalCounter test = new FinalCounter(0);
        test.increment(); // 1
        test.increment(); // 2
        test.increment(); // 3
        test.increment(); // 4
        test.increment(); // 5
        test.decrement(); // 4
        System.out.println(test.getVal());  // prints 4
    }
}
1 голос
/ 14 июня 2011

Последняя переменная может быть инициализирована только один раз, необязательно при ее определении.Его можно установить в любое время в конструкторе, но только один раз.В вашем случае, когда вы увеличиваете i с помощью i ++, вы пытаетесь снова присвоить увеличенное значение i, что недопустимо.

1 голос
/ 14 июня 2011

Я думаю, что можно создать локальную копию переменной i. Попробуйте это:

@Override
public void onClick(View v) {
    final TextView tv = (TextView) findViewById(R.id.tvSayac);

    int i = 1;
    do {
        final int localCopy = i; // Create here a final copy of i
        try {
            new Thread(new Runnable() {

                public void run() {
                    tv.post(new Runnable() {
                        public void run() {
                            // use here the copy
                            tv.setText(Integer.toString(localCopy));
                        }
                    });
                }
            }).start(); // Don't forget to start the Thread!
            i++;
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (i < 16);
}

Путем создания окончательной локальной копии:

  • компилятор больше не будет жаловаться
  • из-за Java-копий по значению вы увеличите i, а не localCopy.

Полагаю, вы тоже хотите запустить поток ...

РЕДАКТИРОВАТЬ: Действительно, вы были правы. Вы должны создать локальную конечную копию внутри цикла. Проверьте новый код.

0 голосов
/ 03 октября 2016

Что я сделал, так это добавил:

private int i;

До этого:

@Override
public void onClick(View v) {
    final TextView tv = (TextView) findViewById(R.id.tvSayac);

    i = 1;
    do {
        try {
            new Thread(new Runnable() {
                public void run() {
                    tv.post(new Runnable() {
                        public void run() {
                            tv.setText(Integer.toString(i));
                        }
                    });
                }
            });
            i++;
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (i < 16);
}

И после этого вы сможете использовать свою переменную как обычно, без необходимости отмечатьэто как финал.

0 голосов
/ 14 июня 2011

Вы можете создать счетчик класса , например, и увеличить его. Таким образом, ссылка на объект Counter может быть окончательной, но вы все равно можете установить его значение?

...