如何增加最终的整数变量?

时间:2011-06-14 10:00:14

标签: java android final

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 个答案:

答案 0 :(得分:6)

final是初始化后无法更改的实体。

Final (Java)

你可以做的是在do / while循环的范围内创建一个变量,该变量是i的最终值并将其发送到函数中。

答案 1 :(得分:5)

这里最简单的解决方案是创建一个类:

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
    }
}

答案 2 :(得分:1)

我认为可以创建变量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

我想你也想启动Thread ......

编辑:的确,你是对的。您必须在循环内创建本地最终副本。检查新代码。

答案 3 :(得分:1)

最终变量只能在定义时才初始化一次。它可以在构造函数中的任何时间设置,但只能设置一次。在你使用i ++递增i的情况下,你试图再次将增加的值分配给i,这是不允许的。

答案 4 :(得分:0)

您可以创建一个计数器类like that并递增它。这样,Counter对象的引用可能是final,但你仍然可以设置它的值吗?

答案 5 :(得分:0)

我做的是添加一个:

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);
}

之后你就可以像往常一样使用你的变量,而不必将其标记为最终变量。