是否应在UPPER-CASE中声明“静态最终记录器”?

时间:2009-09-13 08:24:31

标签: java static naming-conventions final logging

在Java中,静态最终变量是常量,惯例是它们应该是大写的。但是,我已经看到大多数人声称小写的记录器在PMD中出现违规行为。

e.g:

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

只需搜索googleSO获取“静态最终记录器”,您就可以自己看到。

我们应该使用LOGGER吗?

11 个答案:

答案 0 :(得分:276)

记录器引用不是常量,而是最终引用,不应该是大写的。常量VALUE应为大写。

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

private static final double MY_CONSTANT = 0.0;

答案 1 :(得分:212)

为了给crunchdog的答案增加更多价值,Java Coding Style Guide在第3.3段字段命名中说明了这一点

  

用作常量的字段名称应全部为大写,下划线分隔单词。以下被认为是常数:

     
      
  1. 所有static final原始类型(请记住所有接口字段本身就是static final)。
  2.   
  3. 从未跟随“​​static final”(点)的所有.个对象引用类型。
  4.   
  5. 从未跟随“​​static final”(点)的所有[数组。
  6.         

    示例:

    MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME
    

遵循此约定,loggerstatic final对象引用,如第2点所述,但因为每次使用时 后跟“.”它,它不能被视为常数,因此应该是小写。

答案 2 :(得分:42)

来自有效的java,第2版,

  

上一条规则的唯一例外是“常数字段”   其名称应由一个或多个由大小写分隔的大写单词组成   下划线字符,例如VALUES或NEGATIVE_INFINITY。 :一种   constant field是一个静态final字段,其值是不可变的。如果一个   static final字段具有基本类型或不可变引用类型   (第15项),那么它是一个恒定的场。例如,枚举常量   是恒定的领域。 如果静态final字段具有可变引用   如果引用的对象是,则它仍然可以是常量字段   不可变的。

总之,常量==静态最终,加上它是一个引用(与简单类型相比),不变性。

查看slf4j记录器, http://www.slf4j.org/api/org/slf4j/Logger.html

这是不可改变的。另一方面,JUL记录器是可变的。 log4j记录器也是可变的。所以要正确,如果你使用log4j或JUL,它应该是“logger”,如果你使用的是slf4j,它应该是LOGGER。

请注意,上面链接的slf4j javadocs页面有一个示例,它们使用“logger”,而不是“LOGGER”。

这些当然只是约定而不是规则。如果你碰巧使用的是slf4j并且你想使用“logger”,因为你已经习惯了其他框架,或者如果它更容易输入或者为了可读性,请继续。

答案 3 :(得分:32)

我喜欢谷歌对它的看法(Google Java Style

  

每个常量都是静态最终字段,但并非所有静态最终字段都是常量。在选择常量情况之前,请考虑该字段是否真的像一个常量。例如,如果该实例的任何可观察状态可以改变,那么它几乎肯定不是常量。仅仅打算永远不会改变对象是不够的。

示例:

// Constants
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(',');  // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }

// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};

答案 4 :(得分:10)

如果您使用自动化工具检查您的编码标准并且违反了所述标准,那么应该修复它或标准。如果您使用的是外部标准,请修复代码。

Sun Java中的约定是公共静态常量的大写。显然,记录器不是常量,而是代表一个可变的东西(否则就没有必要在它上面调用方法,希望会发生一些事情);对于非常数最终字段没有特定的标准。

答案 5 :(得分:7)

如果你谷歌这个,你可能会发现在某些情况下,记录器没有被定义为静态最终版。添加一些快速复制粘贴到这个,这可以解释它。

我们在所有代码中使用LOGGER ,这与我们的命名约定相符(我们的CheckStyle对它很满意)。


我们甚至更进一步,利用Eclipse中严格的命名约定。 我们使用以下代码模板创建一个新类:

    // private static final Logger LOGGER = Logger.getLogger(${enclosing_type}.class);

记录器被注释掉了,因为最初我们不需要它。但是,如果我们以后需要它,我们只是取消它。

然后在代码中,我们使用期望此记录器存在的代码模板。 try-catch模板示例:

    try {
      ${cursor} or some other template
    } catch (Exception t) {
      LOGGER.error("${methodName} ${method parameters}", t);
    }

我们还有一些使用它的模板。

严格约定使我们能够更高效地与代码模板保持一致

答案 6 :(得分:6)

我个人认为它在大写中看起来很大。此外,由于它是一个与课堂行为没有直接关系的课程,因此我没有发现使用logger而不是LOGGER的主要问题。但如果你要严格迂腐,那就用LOGGER

答案 7 :(得分:4)

不要忘记PMD会尊重评论

// NOPMD

在里面。这将导致PMD从其检查中跳过该行,这将允许您选择所需的样式。

答案 8 :(得分:3)

通常常量是大写的。

但是,记录器不应该是静态的,而是在使用slf4j外观时查找包含类的每个“新”。这避免了特别是Web容器中的一些令人讨厌的类加载器问题,而且它允许记录器框架根据调用上下文执行特殊操作。

答案 9 :(得分:1)

如果你的编码标准 - 如果你有 - 说它应该是大写的那么是。

我没有看到任何一种方式的严格理由。我认为这完全取决于你的个人喜欢。贵公司的编码标准。

BTW:我更喜欢“LOGGER”; - )

答案 10 :(得分:0)

我更喜欢'logger',即小写。原因不是它是一个常数还是一个常数(可变或不可变)。如果使用这种推理方法,那么如果我们更改日志记录框架(或者如果框架更改记录器的可变性),则必须重命名变量。

对我来说,其他原因更重要。

  1. 记录器是类中的影子对象,不应突出显示,因为它未实现主要逻辑。如果我们使用“ LOGGER”,那么代码中的引人注目的就是引起了太多关注。

  2. 有时记录器在实例级别声明(即不是静态的),甚至被注入为依赖项。如果我决定更改获取记录器的方式,则我不想更改代码。代码稳定性。 (很多情况下都是假设的)更改是我更喜欢小写字母的另一个原因。