2012-02-08 11 views
6

thể trùng lặp:
Is there any performance reason to declare method parameters final in Java?
Why would one mark local variables and method parameters as “final” in Java?java: Tại sao biến địa phương cần được khai báo thức

Tôi đang sử dụng PMD để xem vi phạm luật.

Bên trong một phương pháp webservice, tôi có điều này mã dưới đây

public ServiceRequest getData() 
{ 
Status status = new Status(); 
// code 
} 

gì PMD được gợi ý tôi là, tình trạng biến địa phương này có thể được khai báo là final.

Câu hỏi của tôi là, làm cho nó cuối cùng sẽ dẫn đến bất kỳ cải tiến hiệu suất nào hoặc nếu không phải những lợi ích mà mã có thể nhận được?

+0

Bản sao của http://stackoverflow.com/a/266981/259576 –

+0

Như được mô tả trong [stackoverflow answers] (http://stackoverflow.com/questions/316352/why-would-one-mark-local-variables -and-method-parameters-as-final-in-java) trình biên dịch có thể tạo ra mã được tối ưu hóa để có hiệu năng tốt hơn. – ChangeRequest

+0

Hãy mô tả tối ưu hóa * đơn * chỉ có thể nếu biến cục bộ được khai báo cuối cùng - bởi vì tôi chắc chắn không thể nghĩ ra bất kỳ và tôi cũng không thể thấy một biến được mô tả trong liên kết của bạn. – Voo

Trả lời

1

Tôi không biết về lợi ích hiệu suất bằng cách làm cho trạng thái cuối cùng, nhưng PMD đang đề xuất bạn điều này, bởi vì có thể bạn không bao giờ viết về trạng thái sau lần khởi tạo đầu tiên của nó.

Vì vậy, những gì bạn đạt được bằng cách làm cho nó cuối cùng là chỉ rằng mã của bạn là ít dễ bị lỗi - nếu bạn khai báo nó cuối cùng, bạn không thể ghi đè lên nó do nhầm lẫn ...

4

Trích từ bài viết sau: http://www.javapractices.com/topic/TopicAction.do?Id=23

  • rõ ràng giao tiếp ý định của bạn
  • cho phép trình biên dịch và máy ảo để thực hiện tối ưu hóa nhỏ
  • rõ ràng cờ mục đó là đơn giản hơn trong hành vi - thức nói, "Nếu bạn đang tìm kiếm comp lexity, bạn sẽ không tìm thấy nó ở đây. "

này cũng được thảo luận trong câu hỏi này: Can excessive use of final hurt more than do good?

+1

'cho phép trình biên dịch và máy ảo thực hiện tối ưu hóa nhỏ - không có, không thực sự. Loại tối ưu hóa nào sẽ là? – Voo

+2

Tôi đã thấy trình biên dịch của Sun phát ra bytecode ngắn hơn một chút khi sự khác biệt duy nhất giữa hai phương pháp đã là "kết thúc" của các biến cục bộ. Micro-tối ưu hóa là một điều thực sự, và trình biên dịch thực sự làm cho chúng. Điều thực sự quan trọng, tất nhiên, là những gì mà JIT thực hiện với bytecode, và các tham chiếu cục bộ mất "sự kết thúc" của chúng khi được biên dịch sang bytecode. Tôi nghĩ rằng đây là lý do tại sao có rất nhiều suy đoán về các biến cục bộ cuối cùng: đó là kết quả khá không xác định. Tuy nhiên, việc sử dụng những người dân địa phương cuối cùng có thể ảnh hưởng đến bytecode - cho những gì nó đáng giá. –

+0

Mã bytecode do javac tạo ra không mã hóa rằng biến là cuối cùng. JIT không có ý tưởng rằng biến đã từng là cuối cùng. –

4

final chỉ ra các biến địa phương sẽ không được thay đổi. Cảm giác của tôi là các phương thức nên quá ngắn, bạn sẽ có thể dễ dàng hiểu chúng và do đó làm cho biến cuối cùng có thể hơi dư thừa.

Tôi thích tạo các trường final vì làm cho cả lớp quá ngắn, là một hạn chế nghiêm trọng. Ngoài ra, các trường có thể có các vấn đề về an toàn luồng mà các biến cục bộ không có.

+0

Tôi đồng ý. Lý do duy nhất tôi sử dụng người dân địa phương cuối cùng là khi sử dụng các lớp ẩn danh (nhưng sau đó cũng không phải vì tôi ** muốn **). Và tôi nghi ngờ các lợi ích về hiệu suất được tuyên bố - tôi không thấy thông tin bổ sung nào chúng tôi đạt được ở đó. – Voo

+0

JIT là đủ thông minh để làm việc ra biến là có hiệu quả cuối cùng, vì vậy tôi nghi ngờ nó cải thiện hiệu suất nhiều. Trình biên dịch 'javac' cũng đủ thông minh để làm việc với một biến có hiệu quả cuối cùng (tức là không bao giờ thay đổi) và không yêu cầu nó cho các lớp ẩn danh IMHO. Các biến 'final' hữu ích trong các phương thức phức tạp lớn, nhưng giải pháp thực sự là tái xác định mã của bạn để bạn không có các phương thức phức tạp lớn. ;) –

+1

Vì chúng tôi không có tài liệu tham khảo trong java tôi không thấy làm thế nào cuối cùng thay đổi mã trong bất kỳ cách nào. Xem xét: 'int x = 10', x sẽ là 10 miễn là chúng ta không gán giá trị mới * bên trong chính phương thức * (ok yeah trình biên dịch/JIT phải kiểm tra xem chúng ta có làm điều đó không, nhưng đó là rõ ràng để kiểm tra). Yeah cuối cùng có thể hữu ích cho các lập trình viên khác, nhưng sau đó tất cả chúng ta đồng ý rằng nếu một phương pháp dài và phức tạp mà chúng ta không thấy tất cả các bài tập biến đổi, chúng ta có một vấn đề lớn hơn nhiều ở đó;) – Voo