java

Android: Solución a “Variable is accessed within inner class. Needs to be declared final”

El mensaje de error que dice:

Variable is accessed within inner class. Needs to be declared final

Es un error de Java que seguramente más de una vez ha aparecido.

En este caso vamos a ver cómo solucionar este problema al programar en Android usando Java, pero igualmente aplica a otras cosas, pues el lenguaje es Java en todos los casos.

Solución 1: cuando no necesitas cambiar el valor

Declara la variable como final, y ya está. Es decir, si tenías un String definido así:

String nombre = "Luis";

Ahora defínelo así:

final String nombre = "Luis";

No vas a poder cambiar ese valor más tarde, pero sí podrás acceder a él desde clases anónimas y el problema estará resuelto.

Solución 2: cambiar el valor sin usar variables de instancia

El ejemplo de arriba funciona si no quieres cambiar el valor del objeto. En caso de que quieras cambiarlo, la solución es usar un arreglo.

Siguiendo el ejemplo anterior, ahora  declara un arreglo de String, usando final:

final String[] nombre = {"Luis"};

Después, podrás modificar al arreglo:

nombre[0] = "Parzibyte";

Así podrías hacerlo con cualquier tipo de dato, simplemente declarando un arreglo de un elemento. También podrás acceder al mismo.

Solución 3: variables de instancia

Ahora veamos otra solución, la cual es declarar la variable como una variable de instancia. En idioma español, quiere decir que declaremos las variables como miembros de la clase. Así:

See the gist on github.

Después, dentro de cualquier método y cualquier clase anónima podrás acceder y cambiar la variable.

Ejemplo con Android

Hice este post después de investigar sobre las variables de instancia y todo ello, pues estaba intentando acceder a una lista de gastos de tipo List<Gasto>, la cual estaba definida en el método onViewCreated.

Más abajo, al agregar un ClickListener de un elemento, quería recuperar el gasto así:

Gasto gasto = gastos.get(indice);

El problema era que tenía que declarar la variable como final, cosa que no quise hacer. Por lo tanto, saqué la variable gastos del método onViewCreated y el problema se arregló. Es decir, la puse como miembro de la clase.

See the gist on github.

En el ejemplo omití los imports y algunas cosas para explicar la solución. Así es como el error que dice…

Variable is accessed within inner class. Needs to be declared final

… desaparece

Aprovechando esto, te invito a ver un CRUD de SQLite con Android.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Compartir
Publicado por
parzibyte

Entradas recientes

JavaScript (lado del cliente): leer pixeles de imagen

En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…

6 días hace

PHP y JavaScript: llenar select con AJAX

Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…

6 días hace

Imprimir PDF generado con HTML

Hoy vamos a ver programar la impresión de un PDF generado a partir de HTML…

1 semana hace

JavaScript: llenar select con arreglo

En este tutorial básico de JavaScript con HTML vamos a ver cómo llenar una lista…

2 semanas hace

Imprimir PDF a partir de URL

En este artículo se presenta una guía para imprimir un PDF a partir de una…

2 semanas hace

Imprimir PDF a partir de base64

En este post voy a enseñarte cómo imprimir un PDF a partir de su representación…

2 semanas hace

Esta web usa cookies.