有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (3) 个答案

  1. # 1 楼答案

    首先,问题的目标部分:声明日志语句static final是否有性能优势,即:

    private static final String SUCCESS = "Success!";
    //[...]
    log.info(SUCCESS);
    log.info(SUCCESS);
    // versus:
    log.info("Success!");
    log.info("Success!");
    

    JLS在section 3.10.5中指出:

    [A] string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.

    因此,无论您的字符串文本是一次性声明为static final还是在源代码中多次出现,无论在何处使用,它都将始终是相同的字符串实例,因此占用相同的内存量,并且将以完全相同的方式访问。不会有性能差异

    现在问题的另一部分:这是个好主意吗?这本质上是主观的,但我的观点是,应该避免将日志消息声明为static final。日志消息增加了代码的可读性,当代码由未编写它的人维护时,这一点尤为重要。例如:

    log.warn(LOGIN_ERROR_OCCURRED, userId, attempt);
    // compared to:
    log.warn("Login failed for user {}; attempt {} of 5.", userId, attempt);
    

    在代码上下文中读取日志消息要快得多,也容易得多,而不必跳转到代码中的其他地方才能看到完整的日志消息

  2. # 2 楼答案

    更容易的国际化和本地化是为字符串常量使用标识符的可能优势

    ResourceBundle bundle = ...
    private final static LOGIN_ERROR_OCCURRED = bundle.getString("Login failed for user {}; attempt {} of 5");
    

    但是i18n/L10n对于日志消息的好处可能值得怀疑

  3. # 3 楼答案

    日志字符串几乎肯定不应该被声明为public,至少通常不应该。在大多数情况下,最好为它们声明常量变量,但有时您可能会对此感到不安。常量应该一起出现在类源的顶部附近,因此对于记录字符串,这可以很好地概述类中发生的情况。它还可以更容易地找到它们进行维护,比如编辑掉愚蠢的无关感叹号。(别笑,我见过他们。)我不同意他们模糊了日志消息的意义,除非你不擅长命名变量。太多人都这么做了