问题描述
|
我在这里面临一个愚蠢的问题...基本上,我处于For循环中,在此循环中,我始终调用函数来创建按钮。但是在此功能中,我想传递循环迭代器,因为它正在不断变化以区分按钮。但是然后它告诉我,我需要使循环迭代器为“ final \”,这意味着它不会改变!
好吧,我的问题将通过一些基本代码变得更有意义:
for(int i = 0; i < appList.size(); i++) {
//some other stuff including creating the below button \'btn\'
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//set some attribute based on i
//but when I do this it only sets based on the greatest value of i (!)
}
});
}
嗯,我知道这是一个愚蠢的问题...虽然我是Java新手!
干杯。
解决方法
for(int i = 0; i < appList.size(); i++) {
final int _i = i;
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// use _i instead of i
}
});
}
, 考虑以下愚蠢的示例代码:
int i = 0;
obj.invokeThunkAfter10Seconds(new ThunkObject() {
public void thunk() {
System.out.println(i);
}
}
i = 1;
ThunkObject
拥有对i
的引用,但是change4ѭ可以更改,这使得输出无法预测,并且取决于when4ѭ何时更改以及何时调用thunk
。
由于Java没有适当的闭包(根据设计,请参见无法在用其他方法定义的内部类中引用非最终变量),因此明确不允许您捕获此类非最终(即可更改)变量。
相反,您必须声明变量final
,这意味着它已初始化且不可更改。这意味着内部类捕获到“ 4”之后就再也无法更改。
final int i = 0;
obj.invokeThunkAfter10Seconds(new ThunkObject() {
public void thunk() {
System.out.println(i);
}
}
// Can\'t change i here. It will forever now be 0.
在您的示例中,您不能仅将ѭ4设置为final,因为您确实想在每次循环迭代中更改该值。相反,您可以在最终变量中创建值的副本:
for(int i = 0; i < appList.size(); i++) {
//some other stuff including creating the below button \'btn\'
final int capturedI = i;
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//set some attribute based on capturedI
}
});
}