new BigInteger(String)给出了Sonar警告

时间:2018-06-05 08:17:26

标签: java sonarqube biginteger

我正在使用IntelliJ IDEA 2018.1.3旗舰版,需要与大整数(大到不足以适合long,例如20180531234240565494)进行比较,表示为字符串:

public int compareNumeric(String compareTo) {
    return new BigInteger(version).compareTo(new BigInteger(compareTo));
}

这是提议的解决方案here,我一直认为这是从BigInteger创建String的正确方法。

然而,IntelliJ通过Sonar插件提供the following warning

  

不应使用构造函数来实例化“String”,“BigInteger”,“BigDecimal”和原始包装类

  鱿鱼:S2129
  不应使用字符串,BigInteger,BigDecimal的构造函数以及用于包装基元的对象。这样做不太清楚,并且使用的内存比在字符串中使用所需的值更多,并且使用valueOf用于其他所有内容。
  此外,这些构造函数在Java 9中已弃用,这表明它们最终将完全从语言中删除。

  不合规代码示例

String empty = new String(); // Noncompliant; yields essentially "", so just use that.
String nonempty = new String("Hello world"); // Noncompliant
Double myDouble = new Double(1.1); // Noncompliant; use valueOf
Integer integer = new Integer(1); // Noncompliant
Boolean bool = new Boolean(true); // Noncompliant
BigInteger bigInteger = new BigInteger("1"); // Noncompliant
BigDecimal bigDecimal = new BigDecimal(1.1); // Noncompliant<br/>
     

合规解决方案

String empty = "";
String nonempty = "Hello world";
Double myDouble = Double.valueOf(1.1);
Integer integer = Integer.valueOf(1);
Boolean bool = Boolean.valueOf(true);
BigInteger bigInteger = BigInteger.valueOf(1);
BigDecimal bigDecimal = BigDecimal.valueOf(1.1);

首先,我没有在Java 9中看到the constructor被弃用,Sonar在这里错了吗?

我做的比较是错误的并且引发误报,还是应该以其他方式进行比较?

我能想到的另一种方法是直接比较字符串,但这也会迫使我首先检查字符串是否为数字。

1 个答案:

答案 0 :(得分:3)

您遇到的问题SONARJAVA-2740已在最新的SonarJava版本中修复,该版本应在几天内公开发布。