2011-11-29 17 views
28

Duplicar posibles:
Why would one mark local variables and method parameters as “final” in Java?última variable en métodos en Java

Estaba revisando algo de código Java, no soy bueno en Java por lo menos tener algún conocimiento de lo último hace como clases selladas, campos de solo lectura y métodos no reemplazables, pero esto me parece extraño, declarando una variable final en métodos:

private static void queryGoogleBooks(JsonFactory jsonFactory, String query) throws Exception { 
    // Set up Books client. 
    final Books books = Books.builder(new NetHttpTransport(), jsonFactory) 
     .setApplicationName("Google-BooksSample/1.0") 
     .setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() { 
      @Override 
      public void initialize(JsonHttpRequest request) { 
      BooksRequest booksRequest = (BooksRequest) request; 
      booksRequest.setKey(ClientCredentials.KEY); 
      } 
     }) 
     .build(); 

¿Podría decirme cuál es el significado de final en este contexto?

Aquí está el código completo:

http://code.google.com/p/google-api-java-client/source/browse/books-cmdline-sample/src/main/java/com/google/api/services/samples/books/cmdline/BooksSample.java?repo=samples

Respuesta

31

Simplemente hace que la variable local books inmutable. Eso significa que siempre será una referencia a ese mismo objeto Book que se está creando y construyendo, y no se puede cambiar para referirse a otro objeto, o nulo.

El objeto Book en sí mismo todavía se puede modificar como se puede ver en la secuencia de llamadas de acceso. Solo la referencia a él no es.

+1

¿Es destacable que el objeto apuntado por Libros * * es mutable? –

+1

@Doug: Sí, acabo de agregar eso a mi respuesta. Gracias. – BoltClock

+0

+1 luego (una gota en el estanque, aunque ...) –

1

Estoy bastante seguro de que significa nada más que la variable libros no se puede sobrescribir más adelante en el método.

3

Esto también hace que la referencia de la variable sea de solo lectura. Por lo general, esto es para proteger el código de modificar accidentalmente una variable que no debe cambiar.

+0

'final' significa más en este contexto. –

9

En este caso, final Books books simplemente significa que books se le debe asignar un valor exactamente una vez.

Me gusta utilizar la palabra clave final de esta manera, ya que muestra la intención de la variable, que considero una información valiosa cuando se mira el código, ya que elimina otra variable de la situación ... por así decirlo.

Si No marcar una variable como final entonces se destaca como algo para mantener mi ojo en porque va a cambiar los valores en algún momento pronto. Esta información es útil, por ejemplo, cuando se avanza por el código en el depurador o se refactoriza el código de desplazamiento de &.

+0

'final' significa más en este contexto. –

+0

+1 para el enlace, ¡excelente explicación! – NguyenDat

1

Este código está utilizando clase anónima JsonHttpRequestInitializer, donde se refiere a la variable local en queryGoogleBooks método, el problema en este tipo de situación es que la El método queryGoogleBooks podría regresar antes de que se complete el método de inicialización de JsonHttpRequestInitializer, donde podría limpiar la variable y podría causar que el método de inicialización de JsonHttpRequestInitializer falle. Por lo tanto, se requiere declarar las variables como definitivas en este tipo de situaciones.Para más detalles, consulte,

Cannot refer to a non-final variable inside an inner class defined in a different method

+1

La clase anónima no hace referencia a los libros de variables. Si lo hiciera, habría un error de compilación, ya que la clase anónima se está creando antes de que se inicialice la variable. –

Cuestiones relacionadas