Я использую 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, Сонар здесь не так?
Я неправильно сравниваю и выдает ложное срабатывание, или сравнение должно быть выполнено другим способом?
Единственный другой способ, которым я могу придумать, - это сравнить строки напрямую, но это также заставит меня сначала проверить, что строки являются числовыми.