новый BigInteger (String) предупреждает гидролокатора - PullRequest
0 голосов
/ 05 июня 2018

Я использую IntelliJ IDEA 2018.1.3 Ultimate Edition, и мне нужно сравнить с большими целыми числами (достаточно большими, чтобы не помещаться в long, например 20180531234240565494), представленными в виде строк:

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

Это предлагаемое решение здесь , которое я всегда считал правильным способом создания BigInteger из String.

Однако IntelliJ дает следующеепредупреждение через плагин Sonar:

Конструкторы не должны использоваться для создания экземпляров классов "String", "BigInteger", "BigDecimal" и примитива-оболочки кальмар: S2129Конструкторы для Strings, 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, Сонар здесь не так?

Я неправильно сравниваю и выдает ложное срабатывание, или сравнение должно быть выполнено другим способом?

Единственный другой способ, которым я могу придумать, - это сравнить строки напрямую, но это также заставит меня сначала проверить, что строки являются числовыми.

1 Ответ

0 голосов
/ 05 июня 2018

Вы столкнулись с этой проблемой SONARJAVA-2740 , которая была исправлена ​​в последней версии SonarJava, которая должна стать доступной через несколько дней.

...