1

在下面的代码中,第一个if语句抱怨current_guy不能是 a final,但第二个if语句抱怨current_guy不是 final。我没主意了。

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

7 回答 7

8
final int current_guy = a.equals("bf") ? 1 : 0;
于 2012-10-01T19:09:45.263 回答
3

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

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

final int current_guy; // no assignment here

if (a.equals("bf"))
    {
        current_guy=1;
    }
else
    {
        current_guy=0;
    }
于 2012-10-01T19:13:41.093 回答
2

您可以将 current_guy 分配给另一个最终变量

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

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

这会在那个时间点复制变量 current_guy 并将其传递给内部类

这篇 SO文章解释了为什么它必须在内部类中是最终的

于 2012-10-01T19:14:21.393 回答
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()方法可能会在一段时间后响应事件而执行,并且可能位于单独的线程中。然后,您不希望在该处理程序内部或外部某处在执行处理程序时更改变量的值。您可以说这是为了防止对值的脏读。

于 2012-10-01T19:19:59.210 回答
1

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

于 2012-10-01T19:11:53.857 回答
0

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

于 2012-10-01T19:07:36.393 回答
-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);
于 2012-10-01T19:09:38.360 回答