Статьи

Зачем использовать подчеркивание в числах из Java SE 7 — подчеркивание в числовых литералах

В выпуске JDK 1.7 появилось несколько полезных функций, несмотря на то, что большинство из них являются синтаксическим сахаром, их использование может значительно улучшить читаемость и качество кода. Одной из таких особенностей является введение подчеркивания в числовых литералах . Начиная с Java 7 вы можете записать длинную цифру, например, 10000000000, в более читаемый 10_000_000_000 в вашем исходном коде Java. Одна из наиболее важных причин использования подчеркивания в числовом литерале — избегать тонких ошибок, которые трудно понять, посмотрев на код. Трудно заметить отсутствующий ноль или дополнительный ноль между 10000000000 и 1000000000, чем 10_000_000_000 и 1_000_000_000. Поэтому, если вы имеете дело с большими числами в исходном коде Java, используйте подчеркивание в числах для улучшения читабельности . Между прочим, существуют правила использования подчеркивания в числовых литералах, поскольку они также являются допустимым символом в идентификаторе, их можно использовать только между цифрами, точно ни в начале числового литерала, ни в конце числового литерала. В следующих нескольких разделах мы узнаем, как реализовано подчеркивание в числовом литерале и правила его использования в числовых литералах.

Как подчеркивание в числах реализовано в Java

Как я уже сказал, это синтаксический сахар, очень похожий на то, как реализован String в переключателе , это также реализовано с помощью компилятора. Во время компиляции компилятор удаляет эти подчеркивания и помещает фактическое число в переменную. Например, 10_000_000 будет преобразовано в 10000000 во время компиляции. Поскольку у CPU нет проблем с обработкой длинных строк цифр, и это интересно для него, мы не беспокоимся об этом, это мы, бедные люди, которые сталкиваются с проблемой обработки длинных чисел. Эта функция особенно полезна для приложения, связанного с банковскими и финансовыми доменами, которое имеет дело с большой суммой денег, номером кредитной карты, номерами банковских счетов и другими доменами, которое имеет дело с более длинными идентификаторами. Несмотря на то, что настоятельно не рекомендуется писать конфиденциальные данные в файлах Java, и вы никогда не должны делать это в рабочем коде, жизнь с подчеркиванием в цифрах намного проще, чем раньше.

Правила использования подчеркивания в числах в Java

Числа целые

Язык программирования Java имеет строгий набор правил использования подчеркивания в числовых литералах. Как уже говорилось, вы можете использовать их только между цифрами. Вы не можете начать число с подчеркивания или закончить число с подчеркивания. Вот еще несколько мест, где вы просто не можете поместить подчеркивание в числовые литералы:

  1. В начале или конце числа
  2. Смежный с десятичной точкой в ​​литерале с плавающей точкой
  3. До суффикса F или L
  4. В позициях, где ожидается строка цифр

Вот пара примеров, в которых показано допустимое и недопустимое использование подчеркивания в числовых литералах.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
float pi1 = 3_.1415F;      // Invalid; cannot put underscores adjacent (before) to a decimal point
float pi2 = 3._1415F;      // Invalid; cannot put underscores adjacent (after) to a decimal point
long socialSecurityNumber1  = 999_99_9999_L;  // Invalid; cannot put underscores prior to an L suffix
 
int a1 = _52;              // This is an identifier, not a numeric literal, starts with underscore
int a2 = 5_2;              // OK (decimal literal)
int a3 = 52_;              // Invalid; cannot put underscores at the end of a literal
int a4 = 5_______2;        // OK (decimal literal)
 
int a5 = 0_x52;            // Invalid; cannot put underscores in the 0x radix prefix
int a6 = 0x_52;            // Invalid; cannot put underscores at the beginning of a number
int a7 = 0x5_2;            // OK (hexadecimal literal)
int a8 = 0x52_;            // Invalid; cannot put underscores at the end of a number
 
int a9 = 0_52;             // OK (octal literal)
int a10 = 05_2;            // OK (octal literal)
int a11 = 052_;            // Invalid; cannot put underscores at the end of a number

Вот еще несколько примеров использования подчеркивания в числовых литералах

1
2
3
4
5
6
7
8
long creditCardNumber = 6684_5678_9012_3456L;  // Never do it on production code
long socialSecurityNumber = 333_99_9999L;      // Never, Ever do it on production code
float pi =              3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;

Вы можете видеть, что код гораздо удобнее для чтения, чем без подчеркивания в числах. Кстати, всегда используйте L для обозначения длинного литерала в Java. Хотя разрешено использовать маленький регистр l, вы никогда не должны использовать его с числами, так как он выглядит точно так же, как и цифра 1. Скажите, можете ли вы найти различия между 12l и 121, я думаю, не так много. Как насчет 12L и 121?

Короче говоря, всегда используйте подчеркивание в числах , особенно с длинными числами, чтобы сделать их более читабельными. Я знаю, что эта функция доступна только в Java 1.7, и пока она не широко используется, но, учитывая профиль Java 8, я ожидаю, что Java 8 будет принят сообществом быстрее и шире, чем Java 7.