2011-11-29 11 views
28

Powiel możliwe:
Why would one mark local variables and method parameters as “final” in Java?końcowy zmienny w metodach w Javie

byłem sprawdzenie kodu Java, nie jestem dobry w java przynajmniej mieć jakąś wiedzę co final takich jak klasy zamknięte, pola tylko do odczytu i metody nieprzenoszalne, ale wydaje mi się to dziwne, deklarując zmienną final w metodach:

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

Czy możesz mi powiedzieć, co oznacza w tym kontekście znaczenie final?

Oto kompletny kod:

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

Odpowiedz

31

To po prostu sprawia, że ​​zmienna lokalna books niezmienne. Oznacza to, że zawsze będzie to odniesienie do tego samego obiektu Book, który jest tworzony i budowany i nie można go zmienić, aby odnosił się do innego obiektu, lub wartości null.

Sam obiekt Book wciąż zmienny jak widać z sekwencji połączeń dostępowych. Tylko odniesienie do niego nie jest.

+1

Czy warto nic, że obiekt wskazywany przez Books * jest * zmienny? –

+1

@Doug: Tak - właśnie to dodałem do mojej odpowiedzi. Dzięki. – BoltClock

+0

+1 wtedy (kropla w stawie choć ..) –

1

Jestem prawie pewien, że oznacza to tylko zmienną nie można nadpisać później w metodzie.

3

Powoduje to również, że zmienna referencyjna jest tylko do odczytu. Zazwyczaj ma to na celu ochronę kodu przed przypadkową modyfikacją zmiennej, która nie może ulec zmianie.

+0

"końcowe" oznacza więcej w tym kontekście. –

9

W tym przypadku final Books books po prostu oznacza, że ​​books musi zostać przypisana dokładnie raz.

Chciałbym użyć słowa kluczowego final tak, jak pokazuje zamiar zmiennej, którą uważam za cenną informację, gdy patrzę na kod, ponieważ usuwa on kolejną zmienną z sytuacji ... że tak powiem.

Jeśli nie oznaczam jako jako zmienną jako final, to jest to coś, na co mogę uważać, ponieważ wkrótce zmieni ona wartości. Ta informacja jest przydatna, na przykład, przechodząc przez kod w debugerze lub refaktoryzacji & poruszając się po kodzie.

+0

'końcowy' oznacza więcej w tym kontekście. –

+0

+1 za link, doskonałe wyjaśnienie! – NguyenDat

1

Ten kod wykorzystuje anonimowy klasy JsonHttpRequestInitializer, w którym odnosi się do zmiennej lokalnej w metodzie queryGoogleBooks, problemem w takiej sytuacji jest to, że queryGoogleBooks metoda może powrócić przed zakończeniem metody inicjalizacji JsonHttpRequestInitializer, gdzie może wyczyścić zmienną i może spowodować niepowodzenie metody inicjalizacji JsonHttpRequestInitializer. Tak więc wymagane jest zadeklarowanie zmiennych jako ostatecznych w tego typu sytuacjach.Dokładne informacje znajdują się,

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

+1

Anonimowa klasa nie ma odniesienia do książek o zmiennych. Jeśli tak, wystąpiłby błąd kompilacji, ponieważ anonimowa klasa jest tworzona przed zainicjowaniem zmiennej. –