在Java中,静态final变量是常量,按照惯例它们应该是大写的。然而,我已经看到大多数人用小写来声明记录器,这在PMD中是一种违反。
例句:
private static final Logger logger = Logger.getLogger(MyClass.class);
只要搜索__abc0或所以“静态最终记录器”,你就会自己看到这个。
我们应该使用LOGGER吗?
我个人认为它大写看起来真的很大。此外,由于它是一个与类行为没有直接关系的类,我不认为使用logger而不是LOGGER有什么大问题。但如果你想要严格的学究,那么使用LOGGER。
logger
LOGGER
如果您正在使用自动化工具来检查您的编码标准,并且它违反了上述标准,那么它或标准应该被修复。如果您正在使用外部标准,请修复代码。
Sun Java中的约定是大写的公共静态常量。显然,记录器不是常量,而是表示一个可变的东西(否则就没有必要调用它的方法,希望发生一些事情);对于非常数终场没有特定的标准。
记录器引用不是一个常量,而是一个最终引用,不应该是大写的。常量值应该是大写的。
private static final Logger logger = Logger.getLogger(MyClass.class); private static final double MY_CONSTANT = 0.0;
如果你谷歌这个,你可能会发现在某些情况下,记录器没有被定义为静态final。再快速复制粘贴一下,也许就能解释了。
我们使用LOGGER在我们所有的代码中,这对应于我们的命名约定(我们的CheckStyle是满意的)。
// private static final Logger LOGGER = Logger.getLogger(${enclosing_type}.class);
日志记录器被注释掉,因为最初我们不需要它。但是如果我们以后需要它,我们只需取消注释它。
try { ${cursor} or some other template } catch (Exception t) { LOGGER.error("${methodName} ${method parameters}", t); }
我们有更多的模板使用它。
严格的约定使我们在使用代码模板时更加高效和一致。
常量通常是大写的。
然而,记录器不应该是静态的,而是在使用slf4j facade时查找包含类的每个“新”。这避免了web容器中一些讨厌的类加载器问题,而且它允许记录器框架根据调用上下文做一些特殊的事情。
如果你的编码标准——如果你有的话——说它应该是大写的,那么是的。
我看不出任何严格的理由。我认为这完全取决于你个人的喜好。你公司的编码标准。
顺便说一句:我更喜欢“LOGGER”;-)
别忘了,PMD会尊重评论
// NOPMD
在里面。这将导致PMD跳过它的检查行,这将允许你选择任何你想要的样式。
从有效的java,第二版。
前面规则的唯一例外是“常量字段”, 谁的名字应该由一个或多个大写字母组成,以分隔 下划线字符,例如VALUES或NEGATIVE_INFINITY。< >强 Constant field是一个静态final字段,其值是不可变的。如果一个 静态final字段具有基元类型或不可变引用类型 (Item 15),则为常数字段。例如,枚举常量 都是常数场。如果静态final字段具有可变引用 类型,它仍然可以是一个常量字段,如果引用的对象是 不可变的。< /强> < / p >
总之,常量==静态final,如果它是引用(相对于简单类型),则加上不可变性。
查看slf4j记录器, http://www.slf4j.org/api/org/slf4j/Logger.html < / p >
它是不可变的。另一方面,JUL记录器是可变的。log4j日志记录器也是可变的。因此,为了正确起见,如果您正在使用log4j或JUL,它应该是“logger”,如果您正在使用slf4j,它应该是logger。
请注意,上面链接的slf4j javadocs页面有一个使用“logger”而不是“logger”的示例。
当然,这些只是惯例,不是规则。如果您碰巧正在使用slf4j,并且您想要使用“logger”,因为您已经习惯了其他框架中的“logger”,或者如果它更容易输入,或者为了可读性,那么请继续使用。
为了给crunchdog的答案增加更多的价值,Java编码风格指南在第3.3段字段命名中说明了这一点
作为常量使用的字段名称应该全部为大写,用下划线分隔单词。以下被认为是常量: 所有static final基元类型(记住,所有接口字段本质上是static final)。 所有static final对象引用类型后面永远没有"."(点)。 所有后面没有“[”(开方括号)的static final数组。 例子: MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME
作为常量使用的字段名称应该全部为大写,用下划线分隔单词。以下被认为是常量:
static final
.
[
例子:
MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME
遵循此约定,logger是第2点中所述的static final对象引用,但由于每次使用它时是后跟".",因此不能将其视为常量,因此应该小写。
我喜欢谷歌's take on it (谷歌Java样式)
每个常量都是一个静态最终字段,但并不是所有的静态最终字段都是常量。在选择常数情况之前,考虑场是否真的像常数。例如,如果该实例的任何可观察状态可以改变,那么它几乎肯定不是常量。仅仅打算永远不改变对象通常是不够的。
// 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"};
我更喜欢“logger”,即小写。原因不在于它是常量还是非常量(可变的还是不可变的)。如果我们使用这个推理,那么如果我们改变了日志框架(或者框架改变了日志记录器的可变性),我们就必须重命名变量。
对我来说,其他原因更重要。
记录器是类中的影子对象,不应该非常突出,因为它没有实现主要逻辑。如果我们使用'LOGGER',它在代码中会吸引太多的注意力。
有时记录器是在实例级声明的(即不是静态的),甚至是作为依赖注入的。如果我决定改变获取记录器的方式,我不想更改我的代码。代码稳定性wrt。这种变化(在很多情况下是假设的)是我更喜欢小写的另一个原因。