dog*_*ane 232 java logging static final naming-conventions
在Java中,静态最终变量是常量,惯例是它们应该是大写的.但是,我已经看到大多数人声称记录器是小写的,这在PMD中是违规的.
例如:
private static final Logger logger = Logger.getLogger(MyClass.class);
Run Code Online (Sandbox Code Playgroud)
我们应该使用LOGGER吗?
cru*_*dog 288
记录器引用不是常量,而是最终引用,不应该是大写的.常量VALUE应为大写.
private static final Logger logger = Logger.getLogger(MyClass.class);
private static final double MY_CONSTANT = 0.0;
Run Code Online (Sandbox Code Playgroud)
cbl*_*ard 220
为了给crunchdog的答案增加更多价值," Java编码风格指南"在3.3字段命名中说明了这一点
用作常量的字段名称应全部为大写,下划线分隔单词.以下被认为是常量:
- 所有
static final原始类型(请记住,所有接口字段都是固有的static final).- 所有
static final从不跟随"."(点)的对象引用类型.- 所有
static final从不跟随"["(点)的数组.例子:
Run Code Online (Sandbox Code Playgroud)MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME
遵循此约定,logger是static final第2点中所述的对象引用,但因为每次使用它时都会跟着" .",所以它不能被视为常量,因此应该是小写.
Jef*_*man 43
从有效的java,第2版.,
以前规则的唯一例外是"常量字段",其名称应由一个或多个由下划线字符分隔的大写单词组成,例如VALUES或NEGATIVE_INFINITY.常量字段是静态最终字段,其值是不可变的.如果静态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",因为你已经习惯了其他框架,或者如果它更容易输入或者为了可读性,请继续.
mat*_*scb 35
我喜欢谷歌对它的看法(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"};
Run Code Online (Sandbox Code Playgroud)
Pet*_*ham 10
如果您使用自动化工具检查您的编码标准并且违反了所述标准,那么应该修复它或标准.如果您使用的是外部标准,请修复代码.
Sun Java中的约定是公共静态常量的大写.显然,记录器不是常量,而是代表一个可变的东西(否则就没有必要在它上面调用方法,希望会发生一些事情); 对于非常数最终字段没有特定标准.
如果你谷歌这个,你可能会发现在某些情况下,记录器没有被定义为静态最终.添加一些快速复制粘贴到这个,这可能解释它.
我们在所有代码中使用LOGGER,这符合我们的命名约定(我们的CheckStyle很满意).
我们甚至更进一步,利用Eclipse中严格的命名约定.我们使用以下代码模板创建一个新类:
// private static final Logger LOGGER = Logger.getLogger(${enclosing_type}.class);
Run Code Online (Sandbox Code Playgroud)
记录器已注释掉,因为最初我们不需要它.但是,如果我们以后需要它,我们只是取消它.
然后在代码中,我们使用期望此记录器存在的代码模板.try-catch模板的示例:
try {
${cursor} or some other template
} catch (Exception t) {
LOGGER.error("${methodName} ${method parameters}", t);
}
Run Code Online (Sandbox Code Playgroud)
我们还有一些使用它的模板.
在严格的惯例使我们的工作效率和连贯的代码模板.
我个人认为它在大写中看起来非常大.而且,因为它是一个与类行为没有直接关系的类,所以我没有看到使用logger而不是使用的主要问题LOGGER.但如果你要严格迂腐,那就用吧LOGGER.