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

Java 我需要设置一个变量,但我也需要它是最终的。,java,android,final,Java,Android,Final,在下面的代码中,第一个if语句抱怨current\u guy不能是final,但第二个if语句抱怨current\u 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=

在下面的代码中,第一个
if
语句抱怨
current\u guy
不能是
final
,但第二个
if
语句抱怨
current\u 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
   }
}

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

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

检查/调整后,将
current\u 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);

检查/调整后,将
current\u 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);

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

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

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

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

final int current_guy; // no assignment here

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

Jordan Denison在一份被删除的答复中提到了这一点。。不知道为什么,因为这是正确的。这仅仅是对当前答案“完整性”的重新发布。(尽管如此,我可能会在这里使用三元运算符方法。)

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

final int current_guy; // no assignment here

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

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

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

    public void onClick(View v) {
       if (finalCurrentGuy==1) {
         ....
       }
    }
这将在该时间点复制变量current_guy,并将其传递到内部类


SO
post解释了为什么它在内部类中必须是final

您可以将当前变量分配给另一个final变量

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

    public void onClick(View v) {
       if (finalCurrentGuy==1) {
         ....
       }
    }
这将在该时间点复制变量current_guy,并将其传递到内部类

SO
post解释了为什么它在内部类中必须是final

我要做的是:

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

我要做的是:

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

备份。为什么这些变量必须是final?它必须是final,因为它是Java中的事件侦听器。@Makoto:要从嵌套类访问变量,它必须是final。Java规则…备份。为什么这些变量必须是final?它必须是final,因为它是Java中的事件侦听器。@Makoto:要从嵌套类访问变量,它必须是final。Java规则…如果我想将它设置为多个数字,我将如何使用它?像1、2、3、4?@EGHDK一样,最终变量不能设置为倍数。使用前必须精确设置一次。这就是它的工作原理——或者它不是最终的:)我可以这样做吗<代码>最终整数当前值=a等于(“bf”)?4:3:2:1:0 < /代码>你可以链接三元运算符:)就可读性而言,这将是非常困难的。@ EGHDK认为:<代码>最终int CurrntGyGe= DestCurrrgGuy(a);
被调用的方法可以做任何它想做的事情,并且
current\u guy
将被分配一次返回值。如果我想将它设置为多个数字,我将如何使用它?像1、2、3、4?@EGHDK一样,最终变量不能设置为倍数。使用前必须精确设置一次。这就是它的工作原理——或者它不是最终的:)我可以这样做吗<代码>最终整数当前值=a等于(“bf”)?4:3:2:1:0 < /代码>你可以链接三元运算符:)就可读性而言,这将是非常困难的。@ EGHDK认为:<代码>最终int CurrntGyGe= DestCurrrgGuy(a);<代码>调用的方法可以