【发布时间】:2016-08-14 09:09:35
【问题描述】:
我正在编写一些 java 代码,但有一次我在一件事上被阻止了。
final String action = "action1";
final Button otherAction = (findById....);
otherAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (action.equals("action1")) {
action = "action2";
} else if (action.equals("action2")) {
action = "action3";
} else if (action.equals("action3")) {
action = "action1";
}
}
});
显然这段代码不起作用,因为我无法为action 分配新值,因为它是最终变量,因此只能初始化一次。
要从 onClickListener 范围内访问变量,您必须将其声明为 final。
所以我做了什么来解决这个问题:
final Button otherAction = (findById....);
otherAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (t.action.equals("action1")) {
t.action = "action2";
} else if (t.action.equals("action2")) {
t.action = "action3";
} else if (t.action.equals("action3")) {
t.action = "action1";
}
}
});
Class t {
public static String action = "action1";
}
我的问题是:为什么会这样?
【问题讨论】:
-
原因很简单 -
t.action不是最终的 -
匿名内部类只能访问有效的最终变量。一直是explained in detail here
-
@Raman Shrivastava 对,但我认为 OP 问题的要点是为什么
t.action在定义为public static类变量时不需要是最终的,而它必须是final 当它只是一个局部变量时。 -
你可以让
action成为你外部类的实例变量。 -
我已经看到“为什么这不起作用?”问题,但是这个“为什么这有效?”可能是同类中的第一个。 ;-)
标签: java asynchronous scope static final