2012-01-06 83 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注释完成)