2010-10-25 14 views
41

muy básico pregunta, pero, ¿qué significa "final" hacer si se coloca antes de una variable, como a continuación ...¿Qué hace "final" si lo coloca antes de una variable?

final EditText myTextField = (EditText) findViewById(R.id.myTextField); 

¿Qué final hacer?

+0

¡Bien! ¡Creo que tengo mi respuesta! (¡6 respuestas! ¡WOW!) Todo esto funciona. –

+0

¡Entonces acepte el primero! LOL –

+0

Haz que 7 respuestas ... –

Respuesta

67

Respuesta corta

Detiene la "myTextField" siendo variable asignada a otra cosa.

Respuesta larga

  • no detiene el "myTextField" variable que se está mutado, por ejemplo, teniendo sus campos establecidos en nuevos valores.
  • Hace que el código sea más legible (en mi humilde opinión) porque el lector nunca tiene que preguntarse si la variable "myTextField" se reasignará más adelante en el código.
  • Protege contra la categoría de error por el que las variables se reasignan accidentalmente (el mismo razonamiento detrás de hacer que las instancias sean inmutables, solo en una escala más pequeña).

Por las razones indicadas anteriormente, siempre aplico el modificador "final" siempre que puedo a campos estáticos, campos de instancia, variables locales y parámetros de método. Hincha el código un poco, pero para mí vale la pena la legibilidad y robustez extra.

+0

¡Muchas gracias! –

+3

si proporciona una funcionalidad útil, no lo consideraría hinchado. –

+0

Pensé que ya sabía lo suficiente, pero ahora me doy cuenta de que tengo que saber más. :) –

3

No se puede modificar la referencia de myTextField una vez que está asignada. Más información a continuación de Wikipedia

Una última variable sólo se puede asignar vez. Esta asignación no otorga el estado de variable inmutable. Si la variable es un campo de una clase, debe asignarse en el constructor de su clase. (Nota: Si la variable es una referencia , esto significa que la variable no puede ser re-une a referencia otro objeto, pero el objeto que hace referencia sigue siendo mutable, si era originalmente mutable..) A diferencia de la valor de una constante , el valor de una variable final no se conoce necesariamente en tiempo de compilación.

+0

¡Muchas gracias! –

15

La palabra clave final, en este contexto, significa que no se puede actualizar el puntero implícita myTextField para apuntar a un objeto diferente (aunque se puede modificar el objeto apuntado por myTextField). La palabra clave también se puede usar para evitar la anulación (cuando se aplica a clases o métodos).

Una razón por la que puede ver esto es que las clases anónimas que hacen referencia a las variables locales solo pueden hacer referencia a las variables marcadas final. Esto es para que las clases anónimas solo necesiten almacenar una referencia duplicada y no necesiten mantener el acceso completo a la pila de funciones locales. Por ejemplo:

Runnable r = new Runnable() { public static void run() { 
     // do something with myTextField 
     // this would require myTextField to have been marked final. 
}}; 
doSomethingLater(r); 
+0

¡Muchas gracias! –

+0

+1 Impresionante..Nunca sabía de esto. – rkg

2

La palabra clave final declara myTextField como una variable constante.

+0

¡Muchas gracias! –

+1

Parece un oxímoron? –

4

La palabra clave final se asegurará de que myTextField contiene la referencia de cualquier findViewById() devuelve y no permite ninguna otra asignación a myTextField es decir, variable después de la ejecución de la

final EditText myTextField = (EditText) findViewById(R.id.myTextField); 

Si intenta asignar un valor a myTextField , obtendrá un error de compilación.

+0

¡Muchas gracias! –

10

Una cosa que ninguna de las otras respuestas ha notado es que un atributo final tiene propiedades especiales con respecto al modelo de memoria de Java. El efecto neto es que un hilo puede acceder de forma segura al valor de un atributo final sin tomar medidas para sincronizarse con otros hilos.

FOLLOWUP

Es eso JVM específica?

La especificación del modelo de memoria de Java es parte de la especificación de lenguaje de Java, y (AFAIK) no ha cambiado desde Java 1.5. En ese sentido, esto no es específico de JVM.

Sin embargo, el comportamiento de Java si no sigue las reglas (es decir, si su código no sincroniza correctamente su uso de datos compartidos) depende de todo tipo de cosas, incluido el hardware donde ejecuta la aplicación.

Entre otras cosas, el modelo de memoria Java está diseñado para permitir que las máquinas multi-core ejecuten muchos subprocesos Java sin tener que vaciar continuamente las cachés de memoria ... lo que mataría el rendimiento. Básicamente, especifica algunas reglas que garantizarán que un hilo de Java vea las actualizaciones de memoria de otro hilo. Si una aplicación no sigue las reglas, es posible que un hilo verá un valor obsoleto (desactualizado) para algún campo escrito por algún otro hilo, lo que ocasionará un comportamiento indefinido ocasional.

+0

¿Es eso específico de JVM? –

+0

No: está en el JMM. http://stackoverflow.com/questions/3974350/safe-publication-through-final/3974372#3974372 – andersoj

+0

@andersoj - Acabo de decir que :-) –

3

Si una variable está marcada como final, entonces el valor de esa variable no se puede cambiar, es decir, la palabra clave final cuando se usa con una variable la convierte en una constante. Y si intenta cambiar el valor de esa variable durante el curso de su programa, el compilador le dará un error.

Cuestiones relacionadas