variable estaticas java final local-variables

estaticas - variable static java



Uso de variables locales finales en java (8)

Me preguntaba si es posible utilizar las variables locales finales. Las variables no se anulan de todos modos cuando la herencia entra en la imagen. Por ejemplo, un código simple como el siguiente

public static void main(String args[]) { final String data = "Hello World!"; System.out.println(data); }

El ejemplo es bastante simple y puede no ser un código relevante, pero la pregunta es más genérica. He visto una gran cantidad de códigos (todos incorporados en la función principal que tienen variables locales finales). ¿Hay alguna posibilidad de declarar variables locales como otro final? que eso no pueden ser editados en la misma función en sí?


Uso de variables locales finales en java

final campos final , los parámetros y las variables locales son de solo lectura (significa la identidad del objeto, no su estado).


En primer lugar, la parte sobre las variables que se "anula" - final tiene dos significados muy diferentes. Para clases y métodos, se trata de herencia; para las variables se trata de ser de solo lectura.

Hay una "característica" importante de las variables locales finales: se pueden usar en clases internas locales (típicamente anónimas). Las variables locales no finales no pueden ser. Ese es el uso principal de las variables locales para final , en mi experiencia.

public void foo() { final String x = "hello"; String y = "there"; Runnable runnable = new Runnable() { @Override public void run() { System.out.println(x); // This is valid System.out.println(y); // This is not } }; runnable.run(); }

Tenga en cuenta que, por cuestión de estilo, a algunas personas les gusta usar el final incluso cuando no están capturando la variable en una clase interna local. Ciertamente me sentiría cómodo con que el valor predeterminado sea el predeterminado, pero un modificador diferente para "no final", pero me parece que agregar el modificador explícitamente en todas partes distrae demasiado.


Le dice a los otros programadores que quien lo escribió sabía que el valor de los datos no debería cambiar una vez asignado. En mi opinión, es un buen hábito declarar especialmente las variables de parámetro como definitivas .


Puede utilizar final palabra clave final para la legibilidad y asegurarse de que no se modifique o en clases anónimas como aquí:

final String s = "hi"; new Thread(new Runnable() { @Override public void run() { // can use s variable here } }).start();


Respuesta perfecta Jon Skeet, pero hay otro (pequeño) beneficio de las variables finales.

El compilador se asegurará de que la variable final se establezca una sola vez.

Digamos que tienes que inicializar una variable y el cálculo del valor es complejo (múltiples if-then-else dentro de if-then-else). Puede escribir código que no inicialice la variable en alguna condición (o la inicialice dos veces). Por supuesto, esto es un error. Hacer que la variable final permita al compilador verificar que la variable final se establezca una vez y solo una vez. Entonces sabrás rápidamente si tienes un error.

Como dije, poco beneficio, pero sigue siendo útil.


Sí, la usabilidad es: - la variable interna local es accesible por la clase interna del método. Dado que las variables locales viven en la pila y existen solo durante el tiempo de vida del método, el objeto de la clase interna puede vivir más tiempo, por lo que la clase interna no puede acceder a ninguna variable local no final. Pero una vez que la variable es definitiva, la clase interna asegura que el valor no cambiará, por lo que conservará una copia privada de la variable local final para su uso.


sí, hay una pequeña expansión donde normalmente podríamos usarla

Fragmento :

final Boolean data = Boolean.TRUE; button.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (data ) { .... } } });

Es un ejemplo de uso con clases internas anónimas. Si desea usar su variable local dentro de calss interior, debe hacer la final .


se puede acceder a las variables locales finales desde subclases internas anónimas, mientras que las variables locales no finales pueden accederse.