2011-11-29 32 views
28

thể trùng lặp:
Why would one mark local variables and method parameters as “final” in Java?biến cuối cùng trong phương pháp trong Java

Tôi đã kiểm tra một số mã Java, tôi không giỏi java ít nhất có một số kiến ​​thức gì thức thực hiện như các lớp được niêm phong, các trường chỉ đọc và các phương thức không thể ghi đè nhưng điều này có vẻ lạ đối với tôi, khai báo một biến final theo phương pháp:

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

Bạn có thể cho tôi biết ý nghĩa của final trong ngữ cảnh này không?

Đây là mã hoàn chỉnh:

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

Trả lời

31

Nó chỉ đơn giản làm cho biến cục bộ books không thay đổi. Điều đó có nghĩa là nó sẽ luôn luôn là một tham chiếu đến cùng một đối tượng Book được tạo và xây dựng, và không thể thay đổi để tham chiếu đến một đối tượng khác hoặc null.

Bản thân đối tượng Book vẫn còn có thể thay đổi được do có thể nhìn thấy từ chuỗi các cuộc gọi của người truy cập. Chỉ có tham chiếu đến nó là không.

+1

Có giá trị gì mà đối tượng được chỉ dẫn bởi Sách * có thể thay đổi không? –

+1

@Doug: Đúng - tôi vừa thêm vào câu trả lời của mình. Cảm ơn. – BoltClock

+0

+1 sau đó (một giọt trong ao mặc dù ..) –

1

Tôi chắc chắn điều đó có nghĩa là không có gì khác ngoài biến số sách không thể ghi đè sau này trong phương thức.

3

Điều này cũng làm cho tham chiếu biến chỉ đọc. Thông thường, điều này là để bảo vệ mã từ vô tình sửa đổi một biến mà không phải thay đổi.

+0

'final' có nghĩa là nhiều hơn trong bối cảnh này. –

9

Trong trường hợp này, final Books books chỉ đơn giản có nghĩa là books phải được chỉ định giá trị chính xác một lần.

Tôi thích sử dụng từ khóa final như thế này vì nó cho thấy ý định của biến, mà tôi thấy là thông tin giá trị khi xem mã khi nó xóa một biến khác khỏi tình huống ... để nói.

Nếu tôi không đánh dấu biến là final thì nó sẽ nổi bật như một thứ gì đó để theo dõi bởi vì nó sẽ sớm thay đổi giá trị. Thông tin này hữu ích trong khi, ví dụ, bước qua mã trong trình gỡ rối hoặc tái cấu trúc & di chuyển xung quanh mã.

+0

'final' có nghĩa là nhiều hơn trong bối cảnh này. –

+0

+1 cho liên kết, giải thích tuyệt vời! – NguyenDat

1

Mã này được sử dụng lớp nặc danh JsonHttpRequestInitializer, nơi mà nó đề cập đến các biến địa phương trong queryGoogleBooks phương pháp, các vấn đề trong tình huống này là phương thức queryGoogleBooks có thể trả về trước khi phương thức khởi tạo của JsonHttpRequestInitializer được hoàn tất, nơi nó có thể dọn sạch biến và có thể gây ra phương thức khởi tạo của JsonHttpRequestInitializer thành thất bại. Vì vậy, nó là cần thiết để tuyên bố các biến là cuối cùng trong loại tình huống.Để biết thêm chi tiết, hãy tham khảo,

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

+1

Lớp ẩn danh không có tham chiếu đến các sách biến. Nếu nó đã có sẽ có một lỗi biên dịch, kể từ khi lớp vô danh đang được tạo ra trước khi biến được khởi tạo. –

Các vấn đề liên quan