我需要设置一个变量,但我也需要它是最终的。

时间:2012-10-01 19:05:46

标签: java android final

在以下代码中,第一个if语句抱怨current_guy不能成为final,但第二个if语句会抱怨current_guy } isn' ta。我没有想法。

final int current_guy=0;

if (a.equals("bf")){
   current_guy=1;
}

guy1.setOnClickListener(new OnClickListener() {    
   public void onClick(View v) {

   if (current_guy==1) {
      // TODO Auto-generated method stub
   }
}

7 个答案:

答案 0 :(得分:8)

final int current_guy = a.equals("bf") ? 1 : 0;

答案 1 :(得分:3)

Jordan Denison在一个被删除的答案中有这个...不知道为什么,因为它是正确的。这只是重新发布以获得当前答案的“完整性”。 (话虽如此,我可能会在这里使用三元运算符方法。)

请注意,final变量的分配可以延迟,只要在使用前在所有代码路径上分配一次

final int current_guy; // no assignment here

if (a.equals("bf"))
    {
        current_guy=1;
    }
else
    {
        current_guy=0;
    }

答案 2 :(得分:2)

您可以将current_guy指定给另一个最终变量

final int finalCurrentGuy = current_guy;
guy1.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
       if (finalCurrentGuy==1) {
         ....
       }
    }

这会在该时间点复制变量current_guy并将其传递到内部类

This SO帖子解释了为什么它必须在内部类

中是最终的

答案 3 :(得分:2)

我要做的是:

int current_guy=0;

// Set the value that you want based on a condition
if (a.equals("bf"))
{
    current_guy=1;
}

final int valueToTest = current_guy;
guy1.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

if (valueToTest ==1) {
    // your code
    }
}

之所以强调这是因为onClick()方法可能会在一段时间后执行以响应事件,并且可能位于单独的线程中。然后,您不希望在执行处理程序时,在该处理程序内部或外部某处更改变量的值。你可以说它是为了防止对值的脏读。

答案 4 :(得分:1)

第一个抱怨的原因是你无法设置最终变量。它抱怨它不是最终的原因是你正在创造一个所谓的匿名内部阶级。因此,OnClickListener是一个完全独立的类,无法在运行时从主类访问变量。这就是为什么它必须是最终的。然后,当编译器构建您的应用程序时,它知道该值是什么,并可以在那里替换它。如果你想让这个变量变量很好,那么你必须将值传递给OnClickListener,这样它就可以在变量变化时获得更新。

答案 5 :(得分:0)

创建另一个实现OnClickListener的类,并将current_guy作为参数传递给它。这将阻止它抱怨变量不是最终的。在声明内部类和类似方法时,不能引用非final变量。

答案 6 :(得分:-2)

检查/调整后,将current_guy分配给最终变量:

int current_guy=0;


if (a.equals("bf"))
    {
        current_guy=1;
    }

final int final_current_guy = current_guy;

guy1.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {

    // TODO Auto-generated method stub
    if (final_current_guy==1) {
        }
    }

或使用单行分配:

final int current_guy = (a.equals("bf") ? 1 : 0);