我正在使用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在这里错了吗?
我做的比较是错误的并且引发误报,还是应该以其他方式进行比较?
我能想到的另一种方法是直接比较字符串,但这也会迫使我首先检查字符串是否为数字。