【问题标题】:Sonar violation: Invoke method(s) only conditionally声纳违规:仅有条件地调用方法
【发布时间】:2017-11-01 03:12:49
【问题描述】:

我们公司刚刚建立了一个声纳农场。我对我们的代码质量很好奇,想改进。

我有一个包含此类记录器调用的代码:

LOGGER.error(String.format("Cannot load object in status %s (%s)", status, statusDescription), e);

LOGGER.info(String.format("%s object(s) loaded in status %s (%s)", objects.size(), status, statusDescription));

声纳触发规则 squid:S262,仅有条件地调用方法“前提条件”并且日志记录参数不应要求评估。由这两条线触发的规则。

关于这个,我不太清楚发生了什么。解释接缝不太适合我的用例。声纳文档提供了这个例子:

logger.log(Level.DEBUG, "Something went wrong: " + message);  // Noncompliant; string concatenation performed even when log level too high to show DEBUG messages

我完全理解(调试不会登录生产,因此会发生不必要的操作)。但是对于信息和错误级别,我假设您无论如何都想记录它。此外,就我而言,我希望两者都被记录。

哪种方法好? 不使用 String.format 以不同方式重写?将声纳调整为不在信息/错误级别上触发?只是忽略这个声纳?还有什么?

【问题讨论】:

    标签: java logging sonarqube


    【解决方案1】:

    您的连接将在记录器中的条件检查之前完成。因此,如果您调用记录器 10 次并且评估返回 false,那么您的字符串也将无缘无故地连接 10 次。记录器将在其评估通过后处理所有连接和格式化,并且它需要打印一些东西,这样您就可以节省无用的操作。

    LOGGER.error("Cannot load object in status {} ({})", status, statusDescription, e);
    

    【讨论】:

      猜你喜欢
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 2014-05-17
      • 2013-09-02
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多