变量需要声明为final,但也需要声明为非final

  • 本文关键字:final 声明 变量 java android
  • 更新时间 :
  • 英文 :


我有一种情况,我的变量需要作为final访问,但它也需要作为非final访问。

这是我的代码:

public class ShowViewModel extends ViewModel {
public void setShows(final String type, boolean isFavorite, FavoriteHelper favoriteHelper) {
AsyncHttpClient client = new AsyncHttpClient();
ArrayList<Show> listItems = new ArrayList<>();
listItems.clear();
if (isFavorite) {
Cursor cursor = favoriteHelper.queryAll(type);
// this assignment needs listItems as a non-final variable
listItems = MappingHelper.mapCursorToArrayList(cursor);
} else {
String url = String.format("http://api.dev");
client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
try {
String result = new String(responseBody);
JSONObject responseObject = new JSONObject(result);
JSONArray results = responseObject.getJSONArray("results");
for (int i = 0; i < results.length(); i++) {
JSONObject shows = results.getJSONObject(i);
Show show = new Show();
show.setImage(shows.getString("poster_path"));
....
// this assignment needs listItems as a final variable
listItems.add(show);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
}

然后,我尝试将listItems作为类的属性进行移动

public calss ShowViewModel extends ViewModel {
private ArrayList<Show> listItems = new ArrayList<>();
public void setShows(final String type, boolean isFavorite, FavoriteHelper favoriteHelper) {
...
}
}

它没有显示任何错误,并且运行良好。但它影响了我申请的另一部分。

有什么解决方案吗?非常感谢。

正常的解决方案是使用两个变量。例如:

int i = 0;
while (i < 10) {
i++;
executor.submit(new Runnable() {
public void run() {
System.out.println(i);  // Compilation Error
});
}

变为:

int i = 0;
while (i < 10) {
i++;
final int ii = i;
executor.submit(new Runnable() {
public void run() {
System.out.println(ii); // OK
});
}

您应该能够在代码中使用这种方法。

这里有一个简单的解决方案:

List<Show> cursorList = MappingHelper.mapCursorToArrayList(cursor);
listItems.addAll(cursorList);

最新更新