web-dev-qa-db-fra.com

variable finale dans les méthodes en Java

Duplicata possible:
Pourquoi marquer les variables locales et les paramètres de méthode comme "finaux" en Java?

Je vérifiais du code Java, je ne suis pas bon en Java au moins j'ai une certaine connaissance de ce que fait final comme les classes scellées, les champs en lecture seule et non remplaçables) méthodes mais cela me semble bizarre, déclarant une variable final dans les méthodes:

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();

Pourriez-vous me dire quelle est la signification de final dans ce contexte?

Voici le code complet:

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

30
Tarik

Il rend simplement la variable locale books immuable. Cela signifie qu'il sera toujours une référence au même objet Book en cours de création et de construction, et ne peut pas être modifié pour faire référence à un autre objet, ou null.

L'objet Book lui-même est toujours modifiable, comme le montre la séquence d'appels d'accesseur. Seule la référence ne l'est pas.

35
BoltClock

Dans ce cas, final Books books signifie simplement que books doit se voir attribuer une valeur exactement une fois.

J'aime utiliser le mot clé final comme celui-ci car il montre l'intention de la variable, que je trouve être une information précieuse lorsque l'on regarde le code car il supprime encore une autre variable de la situation ... pour ainsi dire.

Si je ne marque pas une variable comme final alors elle se démarque comme quelque chose à garder à l'œil car elle va changer les valeurs bientôt. Ces informations sont utiles lorsque vous parcourez, par exemple, le code dans le débogueur ou que vous refactorisez et déplacez le code.

12
Nate W.

Cela rend également la référence de variable en lecture seule. Il s'agit généralement de protéger le code contre toute modification accidentelle d'une variable qui ne doit pas changer.

4
mellamokb

Je suis presque sûr que cela ne signifie rien de plus que la variable books ne peut pas être écrasée plus tard dans la méthode.

1
Me1000

Ce code utilise la classe anonyme JsonHttpRequestInitializer, où il fait référence à la variable locale dans la méthode queryGoogleBooks, le problème dans ce type de situation est que la méthode queryGoogleBooks pourrait retourner avant que la méthode d'initialisation de JsonHttpRequestInitializer soit terminée, où elle pourrait nettoyer la variable et pourrait entraîner l'échec de la méthode d'initialisation de JsonHttpRequestInitializer. Il est donc nécessaire de déclarer les variables comme finales dans ce type de situations. Pour plus de détails, reportez-vous à,

Ne peut pas faire référence à une variable non finale à l'intérieur d'une classe interne définie dans une méthode différente

1
Low Flying Pelican