代码之家  ›  专栏  ›  技术社区  ›  dogbane

是否应在大写字母中声明“静态最终记录器”?

  •  213
  • dogbane  · 技术社区  · 15 年前

    在爪哇中,静态最终变量是常量,而惯例是它们应该是大写的。然而,我已经看到大多数人在较低的情况下声明伐木工人,这是违反 PMD .

    例如:

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

    只是搜索 google SO 对于“静态最终记录器”,您将亲自看到这一点。

    我们应该改为使用记录器吗?

    10 回复  |  直到 15 年前
        1
  •  263
  •   crunchdog    15 年前

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

    private static final Logger logger = Logger.getLogger(MyClass.class);
    
    private static final double MY_CONSTANT = 0.0;
    
        2
  •  201
  •   Kwadz LazyOne    7 年前

    为了给crunchdog的答案增加更多价值, Java Coding Style Guide 在第3.3段“字段命名”中对此进行了说明。

    用作 常量 应全部为大写,用下划线分隔单词。以下为常数:

    1. 所有 static final 基本类型(记住 全部的 接口字段是固有的 静态最终 )
    2. 所有 静态最终 对象引用类型,后面永远不会有“ . “(点)。
    3. 所有 静态决赛 数组后面永远不会有“ [ “(点)。

    实例:

    MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME
    

    依照本公约, logger 是一个 静态最终 如第2点所述的对象引用,但因为 其次是“ . “每次使用它,它都不能被视为常量,因此应该是小写的。

        3
  •  39
  •   Jeffrey Blattman    5 年前

    从有效的Java,第二版,

    前一条规则的唯一例外是__常量字段,__ 其名称应由一个或多个大写字母组成,用 下划线字符,例如值或负无穷大。 一 常量字段是值不可变的静态最终字段 . 如果A 静态最终字段具有基元类型或不可变的引用类型 (第15项),则它是一个常量字段。例如,枚举常量 是常量字段。 如果静态最终字段具有可变引用 类型,如果引用的对象是 不变的

    总之,constant==static final,加上它是一个引用(与简单类型相比),是不可变的。

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

    它是不变的。另一方面,jul记录器是可变的。log4j记录器也是可变的。所以正确的说,如果您使用log4j或jul,它应该是“logger”,如果您使用slf4j,它应该是logger。

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

    当然,这些只是惯例而不是规则。如果您碰巧使用了slf4j,并且您希望使用“logger”,因为您已经习惯了其他框架中的日志,或者如果它更容易键入,或者为了可读性,请继续。

        4
  •  30
  •   mateuscb    9 年前

    我喜欢谷歌的表现( 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"};
    
        5
  •  10
  •   Pete Kirkham    15 年前

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

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

        6
  •  7
  •   Imre KLE    9 年前

    如果你谷歌搜索这个,你可能会发现在某些情况下,记录器并没有被定义为静态的final。添加一些快速的copy-n-paste来解释这一点。

    我们使用记录器 在我们所有的代码中,这与我们的命名约定相对应(并且我们的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);
        }
    

    我们有更多的模板可以使用它。

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

        7
  •  6
  •   João Silva    15 年前

    我个人认为它看起来真的很大。此外,由于它是一个与类行为没有直接关系的类,所以我看不到使用中的主要问题 logger 而不是 LOGGER .但如果你要严格地学究,那就用 记录器 .

        8
  •  4
  •   Fortyrunner    15 年前

    别忘了PMD会尊重

    // NOPMD
    

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

        9
  •  3
  •   Thorbjørn Ravn Andersen    15 年前

    常量通常为大写。

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

        10
  •  1
  •   Kutzi    15 年前

    如果您的编码标准——如果您有——说它应该是大写的,那么是的。

    我看不出有任何严格的理由。我认为这完全取决于你个人的喜好。贵公司的编码标准。

    顺便说一句:我更喜欢“记录器”;-)