2012-01-06 80 views
10

最好的辦法,我只是wantd知道這是在java中的最佳方式申報記錄變量。 以下是一些聲明。這是聲明記錄變量在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我真的很感激,如果有人知道另一種最好的替代方法來聲明looger變量。

+2

由你決定,但是你應該去'最終'版本 – fge 2012-01-06 10:43:09

+0

可能的重複[應該在UPPER-CASE中聲明一個「靜態最終記錄器」嗎? /stackoverflow.com/questions/1417190/should-a-static-final-logger-be-declared-in-upper-case) – dogbane 2012-01-06 10:43:39

回答

6

我投

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

這是final因爲你不改變它,它以大寫,因爲它是一個常數。

+1

它不應該是大寫字母。 「Java編碼風格指南」,「Google Java風格」說,它應該是小寫的「記錄器」。這是beeing在這裏討論:http://stackoverflow.com/q/1417190/603314 – 2017-02-08 15:03:51

0

第一個是best.I喜歡記錄儀是finalstatic ....

+0

這是爲什麼呢? – 2012-01-06 10:43:55

+0

@abhutra:感謝您的快速回復。但PMD規則說靜態最終變量應該是資本。 – Raje 2012-01-06 10:47:51

1

我會去的第一選擇,但它是個人的選擇,我想的事情。

+0

但PMD規則說靜態最終變量應該是大寫 – Raje 2012-01-06 10:48:03

+1

@Raje:在這種情況下,PMD正在故意鈍化。查看Java標準庫類(例如'System')中的任何靜態final字段,該字段不是「真實」常量(即不是原始字符串或「String」)。他們不使用這些變量的大寫名稱。 – 2012-01-06 11:02:47

+0

好點Sanjay。 – 2012-01-06 12:19:46

11

全部大寫的變量名是國際海事組織,因爲你真的不聲明/定義一個常數,而是一個靜態變量。大寫名稱更適合「常量」。也就是說,我會親自採取第一種方法。

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

我完全同意你的發言。另外,當你有LOGGER時,看起來這個變量只是尖叫着你,因爲你的注意力不應該發生。 – Jeach 2014-03-13 16:29:44

0

在我對java風格指南的理解中,'logger'是最好的。 '記錄器'將用於定義的常量。

此外,使用「最終」,應該讓它快一點。

因此#1。

3

我個人認爲private static final Logger LOGGER= Logger.getLogger(ServiceImpl.class);是去語義和性能方面的原因的最佳方式:

  • 您的登錄所屬的類不是它的各種情況,因爲這個原因,你應該讓靜態
  • 因爲它是由類內部使用它應該是私有的,這不是它的公共API的一部分
  • 使其最後兩個是有道理的,一是因爲這個規定,REFFERENCE不會改變(這是這裏的情況),其次是因爲最終的實際變量(特別是靜態變量)可以更好地進行優化編譯器和JIT的速度更快(更多細節 here
  • 命名它全部大寫字母實際上只是一個很好的約定,這是如何在Java中聲明靜態變量,它並不是一個必須的東西,但它使代碼更具可讀性
0

我建議不要在每一類中使用這樣的變量,而是委託這項工作圍繞SLF4J一個靜態實用的包裝,從jcabi-log

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

檢查這篇文章,以及:http://www.yegor256.com/2014/05/23/avoid-java-static-logger.html

+0

雖然如果您想在日誌語句中使用調用者的文件名和行,而不是實用程序類中的位置,則實現起來有點棘手。但它實際上可以通過使用'org.slf4j.spi.LocationAwareLogger'來實現。 – ddekany 2017-10-02 21:49:51

0

這是良好的編程習慣分享所有特定類的實例之間的單個記錄對象,並使用相同的logger在計劃的時間,因此我們使用staticfinal的記錄器。

建議不要使用多個記錄器(差的記錄練習),而不是記錄級別。

我認爲

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

是更好的選擇。

+0

問題中的所有記錄器聲明已經是'static'並聲明爲一個變量,問題是詢問它是否應該是'final'並且以'UPPER'或'lower'命名。 – Leigh 2014-05-21 12:12:34

0

此處沒有人使用LOGlog?我發現它在實踐中更好。 (當然,我不是第一個在標準的地方工作的人,因爲在龍目島的@Log4j也會產生一個log的字段,當然它也是靜態的最後一個字,而且這是聲明這個字段的最好方法。添加一個@Log4j註釋完成)