final DataAccess data = new DataAccess(db);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
List<String> countries = data.getCountries();
}
}
Есть причина, почему мы делаем это. Когда вы вызываете «new OnItemClickListener ()», вы по сути создаете анонимный внутренний класс. Генерируемый байт-код на самом деле не переводится во внутренний класс, JVM не имеет представления об этом внутреннем классе.
Файлы внутреннего класса переводятся в отдельные файлы классов, в которых есть комбинация файла внешнего класса и файла внутреннего класса, разделенных знаком "$". Поскольку в данном случае это Anonymous, целые числа используются для идентификации внутреннего класса.
OuterClass$1.class
В приведенном выше сценарии, когда вы создаете переменную в классе Outer, внутренний класс не будет об этом знать.
Однако, когда вы помечаете его как final, внутренний класс (фактический файл класса) получит скрытую переменную внутри него со ссылкой на переменную внешнего класса.
data$data
Надеюсь, это поможет.