2012-01-06 37 views
10

Tôi chỉ muốn biết đó là cách tốt nhất để khai báo biến logger trong java. Sau đây là một số tuyên bố.Cách tốt nhất để khai báo biến logger trong java

1> private static final Logger logger = Logger.getLogger(ServiceImpl.class); 

2> private static Logger logger = Logger.getLogger(ServiceImpl.class); 

3> private static final Logger LOGGER= Logger.getLogger(ServiceImpl.class); 

4> private static Logger LOGGER= Logger.getLogger(ServiceImpl.class); 

P.S tôi thực sự đánh giá cao nếu có ai biết cách thay thế tốt nhất khác để khai báo biến trống hơn.

+2

Tùy thuộc vào bạn, nhưng bạn nên tìm phiên bản 'final' – fge

+0

có thể trùng lặp của [Logger-static final Logger" được khai báo trong UPPER-CASE?] (http://stackoverflow.com/questions/1417190/should-a-static-final-logger-be-declared-in-upper-case) – dogbane

Trả lời

6

Tôi bỏ phiếu cho

private static final Logger LOGGER = Logger.getLogger(ServiceImpl.class); 

Đó là final vì bạn không thay đổi nó và đó là viết hoa vì nó là một hằng số.

+1

Nó không được viết hoa. "Hướng dẫn về kiểu mã hóa Java", "Phong cách Java của Google", nói rằng cần phải có chữ "logger" thấp hơn. Đó là beeing thảo luận ở đây: http://stackoverflow.com/q/1417190/603314 –

0

Đầu tiên là best.I thích logger được finalstatic ....

+0

Tại sao vậy? –

+0

@abhutra: cảm ơn bạn đã trả lời nhanh. nhưng các quy tắc PMD nói biến cuối cùng tĩnh phải là vốn. – Raje

1

tôi sẽ đi với các tùy chọn đầu tiên nhưng nó là một vấn đề của sự lựa chọn cá nhân tôi đoán.

+0

nhưng quy tắc PMD cho biết biến cuối cùng tĩnh phải là số vốn – Raje

+1

@Raje: PMD đang được cố ý ẩn ý trong trường hợp này. Xem xét bất kỳ trường cuối cùng tĩnh nào trong lớp thư viện chuẩn Java (Ví dụ: 'Hệ thống') không phải là hằng số" thực "(tức là không phải nguyên thủy hoặc' Chuỗi'). Họ không sử dụng tên viết hoa cho các biến này. –

+0

Điểm tốt Sanjay. –

11

Tất cả các tên biến phía trên đều là IMO vì bạn thực sự không khai báo/xác định hằng số mà là biến tĩnh. Tên viết hoa phù hợp hơn cho "hằng số". Điều đó nói rằng, cá nhân tôi đi với cách tiếp cận đầu tiên.

private static final Logger logger = Logger.getLogger(ServiceImpl.class); 
+3

Tôi hoàn toàn đồng ý với tuyên bố của bạn. Thêm vào đó khi bạn có LOGGER, có vẻ như biến đó chỉ la hét với bạn vì sự chú ý của bạn mà không nên xảy ra. – Jeach

0

Theo hiểu biết của tôi về hướng dẫn kiểu java, 'logger' là tốt nhất. 'LOGGER' sẽ là một hằng số xác định.

Hơn nữa, sử dụng 'cuối cùng', nên làm cho nó nhanh hơn một chút.

Như vậy # 1.

3

Cá nhân tôi nghĩ private static final Logger LOGGER= Logger.getLogger(ServiceImpl.class); là cách tốt nhất để đi cho ngữ nghĩa và hiệu suất lý do:

  • Log của bạn thuộc về lớp không để các trường hợp khác nhau của nó, vì lý do này, bạn nên làm cho nó tĩnh
  • nó phải là riêng tư bởi vì nó được sử dụng trong nội bộ bởi lớp, nó không phải là một phần của API công khai
  • làm cho nó trở thành hai ý nghĩa, trước hết bởi vì điều này quy định rằng sự tái sử dụng sẽ không thay đổi (đây là trường hợp ở đây) và thứ hai vì các biến quan hệ cuối cùng (đặc biệt là các biến tĩnh) có thể được tối ưu hóa tốt hơn cho tốc độ của trình biên dịch và JIT (xem chi tiết here)
  • đặt tên tất cả trường hợp trên thực sự là một quy ước tốt đẹp, đó là cách biến tĩnh được khai báo trong Java, nó không thực sự là phải, nhưng nó làm cho mã dễ đọc hơn
0

tôi khuyên bạn không nên sử dụng một biến như vậy trong mỗi lớp, nhưng thay vì ủy thác công việc này cho một wrapper tiện ích tĩnh xung quanh slf4j, từ jcabi-log:

Logger.debug(this, "some variable = %s", value); 

Kiểm tra bài này cũng như: http://www.yegor256.com/2014/05/23/avoid-java-static-logger.html

+0

Mặc dù đó là một chút khó khăn để thực hiện nếu bạn muốn có tên tập tin của người gọi và dòng trong báo cáo đăng nhập của bạn, trái ngược với vị trí từ lớp tiện ích của bạn. Nhưng nó thực sự có thể thực hiện được bằng cách sử dụng 'org.slf4j.spi.LocationAwareLogger'. – ddekany

0

Thực hành lập trình tốt để chia sẻ một đối tượng logger duy nhất giữa tất cả các cá thể của một lớp cụ thể và sử dụng cùng một trình ghi trong suốt thời gian của chương trình, vì vậy chúng tôi sử dụng staticfinal để ghi nhật ký.

Không nên sử dụng nhiều logger (thực hành khai thác kém) thay vì mức ghi nhật ký.

Tôi nghĩ rằng

private static final Logger logger = Logger.getLogger(ServiceImpl.class); 

là lựa chọn tốt hơn.

+0

Tất cả các khai báo trình ghi trong câu hỏi đã là 'static' và được khai báo là một biến, câu hỏi đặt ra là liệu nó có phải là' final' và được đặt tên trong 'UPPER' hoặc' lower'. – Leigh

0

Không ai ở đây sử dụng LOG hoặc log? Tôi đã thấy nó đẹp hơn trong thực tế. (Chắc chắn tôi không phải là người đầu tiên làm việc trên một nơi mà đó là tiêu chuẩn, bởi vì @Log4j ở Lombok tạo ra một lĩnh vực log là tốt. Tất nhiên nó cũng là tĩnh cuối cùng. Và BTW, đó là cách tốt nhất để tuyên bố lĩnh vực đó .. Thêm một chú thích @Log4j. Hoàn thành.)

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