在以下代码中,第一个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
}
}
答案 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);