2011-01-15 13 views
9

Tôi đã thấy một số mã trong slf4j như hiển thị bên dưới. Tôi không biết tại sao nên tránh gập liên tục ở đây. Có cần thiết để làm điều đó không? hoặc chỉ là thực hành tốt nhất. lợi ích của việc này là gì?lý do tại sao để tránh gấp liên tục trong Java? Khi nào?

Cảm ơn.

/** 
    * Declare the version of the SLF4J API this implementation is compiled against. 
    * The value of this field is usually modified with each release. 
    */ 
// to avoid constant folding by the compiler, this field must *not* be final 
public static String REQUESTED_API_VERSION = "1.6"; // !final** 
+0

Bạn đã xem wiki về chủ đề này chưa? Tôi nghĩ nó giải thích khá tốt. http://en.wikipedia.org/wiki/Constant_folding – CoolBeans

+0

Bạn có thể sử dụng phương thức thay vì để lộ trường này (có thể là tốt nhất), sử dụng 'final' nhưng chuyển giá trị thông qua một phương thức (' "1.6" .toString() ') hoặc thêm một số mã để ngăn chặn nó là một * biên dịch-thời gian liên tục * nhưng không thêm bất kỳ bytecode không cần thiết ('null! = null?" ":" 1,6 "'). –

+0

Vâng, hằng số tĩnh công cộng là icky! –

Trả lời

6

Trong trường hợp cụ thể nơi bạn đang phát hành thư viện, bạn thường không có quyền kiểm soát phiên bản cuối cùng của thư viện ghi nhật ký cuối cùng được liên kết ở cuối. Ví dụ bạn đang sử dụng phiên bản 1.6 và ứng dụng đang sử dụng thư viện của bạn có thể sử dụng phiên bản 1.6.1 để nhận bản sửa lỗi. Vì nó chỉ là một điểm phát hành nên tương thích với API, nhưng nếu thư viện của bạn kiểm tra phiên bản SLF4J thì nó sẽ hiển thị 1.6.1 không 1.6.

Nếu hằng số được gạch chân, bạn sẽ thấy 1,6 (vì nó được sao chép vào tệp lớp của bạn) ngay cả khi thư viện được nâng cấp sau khi thực tế.

+0

Một dự án tôi đã từng làm việc trên, AviSynth, đã tìm ra điều này một cách khó khăn khi họ mở rộng ABI của họ giữa các phiên bản nhỏ. Không thể do quá nhiều nội tuyến và quá nhiều sự phụ thuộc vào VC6. Phiên bản chính tiếp theo sử dụng ABI "ảo" và làm việc tuyệt vời. – SilverbackNet

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