2013-08-01 60 views
15

Tôi biết trình biên dịch diễn giải từ khóa cuối cùng trong Java như thế nào, nhưng các lập trình viên của chúng ta nên hiểu nghĩa của nó như thế nào? nó nên là:giải thích biến cuối cùng

1) Biến này không thể thay đổi (được sử dụng bởi lớp bên trong ví dụ)

hoặc

2) Tôi không có kế hoạch thay đổi biến này (sức có một số tối ưu hóa lợi ích cho các biến thành viên).

Tôi hỏi vì tôi đã làm việc trên mã nơi mọi thứ được khai báo theo mặc định (tùy chọn 2 ở trên), theo ý kiến ​​của tôi, giảm giá trị và ẩn các giá trị thực sự không thể thay đổi! Vẫn còn lợi ích hiệu suất trong việc khai báo biến cuối cùng?

Trả lời

17

Mọi thứ ở vị trí cuối cùng theo mặc định là điều tốt. Bạn càng có thể mô hình hóa mã của bạn trên bất biến, thì nó càng có xu hướng dễ hiểu hơn.

Sử dụng final hầu như không bao giờ về hiệu suất theo ý kiến ​​của tôi. Đó là về việc xác nhận về phần còn lại của mã (không có gì thay đổi biến này) có thể giúp người đọc hiểu mã và có thể được trình biên dịch kiểm tra.

EDIT: Ở trên là chế độ xem của tôi cho các trường. Đối với các biến cục bộ (bao gồm các tham số), cá nhân tôi chỉ sử dụng final khi biến sẽ được sử dụng trong một lớp bên trong vô danh. Điều này khác với các trường vì:

  • Thật dễ dàng để xem toàn bộ ngữ cảnh của phương pháp - và nếu không, đó là vấn đề.
  • Vì nó không đại diện cho trạng thái của một đối tượng (hoặc lớp), những lợi ích của bất biến không thực sự áp dụng.
+0

Tôi chấp nhận điều này cho các biến thành viên, điều gì về các biến và tham số cục bộ? Chắc chắn có rất ít lợi ích trong việc đánh dấu chúng như là cuối cùng, trừ khi họ thực sự cần phải được? – StuPointerException

+0

Có lợi ích khi đọc/duy trì mã. –

+0

Cái kẹp duy nhất tôi có với 'final' là tôi cần viết nó. Ví dụ, nó biểu lộ các chữ ký phương thức nên tôi không sử dụng nó ở đó. Thay vào đó, tôi có một cảnh báo trình biên dịch của một tham số thay đổi. –

1

Tùy chọn thứ 2 là biện pháp bảo vệ. Nó dừng bạn khỏi vô tình thay đổi hoặc chuyển nhượng lại. Như vậy nó rất hữu ích để cung cấp và bạn có thể loại bỏ khi bạn quyết định bạn muốn biến đó thay đổi.

0

Tôi không hiểu tại sao bạn cho rằng thiếu giá trị.

Khi tôi thấy tất cả các biến cuối cùng, điều đó ngụ ý rằng lớp học là không thay đổi. Đó là một điều tốt, bởi vì các lớp học bất biến vốn vốn dĩ an toàn.

+0

Danh sách cuối cùng không phải là bất biến. –

+0

Tham chiếu chắc chắn là. Bạn nên sử dụng bộ sưu tập được đồng bộ hóa để sửa đổi nội dung của nó. – duffymo

0

biến cuối cùng là a good thing nói chung. Lưu ý rằng nó chỉ có nghĩa là biến không thể được gán lại, nhưng đối tượng nó trỏ đến có thể thay đổi nếu biến đó có thể thay đổi.

Hiệu suất khôn ngoan, final cho phép tích cực hơn compiler optimisations:

các đặc điểm kỹ thuật cho phép tối ưu hóa mạnh mẽ của lĩnh vực thức. Trong một chủ đề, nó được phép sắp xếp lại các lần đọc của một trường cuối cùng với những sửa đổi của một trường cuối cùng không diễn ra trong hàm tạo.

4

Tôi đã viết a post about this cách đây không lâu.

cuối cùng giúp đọc mã vạch:

  • mà không sử dụng tất cả mọi thứ cuối cùng có thể có thể thay đổi (mớ hỗn độn tiềm năng)
  • nó buộc thiết lập một biến trước khi nó có thể được sử dụng (hữu ích trong việc xây dựng)

Bằng cách sử dụng cuối cùng, bạn cho trình biên dịch biết về mã của bạn và nó giúp bạn đổi lại.

-1

Đúng là biến cuối cùng được sử dụng để không ai có thể thay đổi giá trị, nó hoạt động như hằng số trong java.

Để tôi cho ví dụ

Tôi đã tạo ra một gói có thể được sử dụng bởi một số người khác là tốt, hiện nay có một số biến cấu hình được cần phải thiết lập để chạy nó đúng cách. cho phép nói gói đăng nhập của nó. Vì vậy, có thể có vài tùy chọn mã hóa như

encryption_method = HASH_ENCRYPTION

HOẶC

encryption_method = SYMMETRIC_ENCRYPTION

thay vì đi qua số nguyên 1, 2, 3, chúng tôi có thể định nghĩa biến thức giúp nhà phát triển trong hơn biểu mẫu có thể đọc và ofcource tôi không muốn người dùng thay đổi nó để tôi giữ nó cuối cùng, logic nội bộ khác có thể vi phạm

5

final từ khóa nên bị bỏ rơi, nó phải là tiêu chuẩn trong tất cả các trường hợp được áp dụng, và dứt khoát chỉ nên revokable với một từ khóa như

this_variable_will_change_unexpectedly_behind_your_back 

Từ khóa này không nên được tự động hoàn tất bởi bất kỳ IDE, và nó shoud không thể để chèn nó bằng Ctrl-V.

+3

Hoàn toàn dựa trên ý kiến, nhưng tôi tình cờ chia sẻ mọi từ của nó :) –

+0

Tôi thích nó, ngoài phần ctrl-V;) – StuPointerException

+3

Và trò đùa "biến" có nghĩa là "nó có thể thay đổi sau lưng bạn "... nhà toán học sẽ nói gì nếu biến của anh ta thay đổi ngay bên trong một biểu thức? –

1

Tôi không thể thêm nhiều vào những gì Jon đã nói, nhưng chỉ để hoàn thành, JLS 17.5.3 cho biết các trường cuối cùng cũng có thể dẫn đến tối ưu hóa;

Nếu một lĩnh vực cuối cùng được khởi tạo một biểu thức hằng số thời gian biên dịch (§15.28) trong tờ khai trường, thay đổi đối với lĩnh vực cuối cùng có thể không được tuân thủ, vì sử dụng điều đó lĩnh vực thức được thay thế tại thời gian biên dịch với giá trị của biểu thức hằng số.

0

Khai báo mọi biến là final không bị lệch giá final từ khóa. Nó giúp các nhà phát triển trong gỡ lỗi ứng dụng để loại trừ khả năng sửa đổi các biến, đặc biệt là trong môi trường đa luồng của ứng dụng.

Với java 8 phát hành, chúng tôi đã một khái niệm hơn gọi là "effectively final variable"

biến

địa phương tham chiếu từ một biểu thức lambda phải thức hoặc có hiệu quả thức

Một biến được coi là hiệu quả cuối cùng nếu có không được sửa đổi sau khi khởi tạo trong khối cục bộ. Điều này có nghĩa là bây giờ bạn có thể sử dụng biến cục bộ mà không có từ khóa cuối cùng bên trong một lớp ẩn danh hoặc biểu thức lambda, miễn là chúng phải có hiệu quả cuối cùng.

Nếu bạn không muốn khai báo hiệu quả cuối cùng là biến cuối cùng, tính năng mới này sẽ giúp bạn nếu bạn đang sử dụng biểu thức lambda/lớp ẩn danh. Bạn có thể tránh khai báo từ khóa final cho các biến số effective final. Hãy xem điều này article