В двух постах до этого описал некоторые новшества из Project Coin – Java 7, а именно:
1) Дельфин, монета и бриллиантовый оператор.
– Improved type inference for generic instance creation (diamond)
– try-with-resources statement
2) Java 7. Строки в переключателе
– Strings in switch
Сейчас хотел описать три оставшихся нововведения:
– Целые числа в двоичном представлении и подчеркивание (Binary integral literals and underscores in numeric literals).
– Возможность ловить несколько разных исключений и более точная переброска (Multi-catch and more precise rethrow).
– Упрощенный вызов методов с переменным количеством аргументов (Simplified varargs method invocation).
1. Целые числа в двоичном представлении и подчеркивание.
Стало попроще работать с целыми числами.
Во-первых можно писать в двоичном виде:
int mask = 0b1000; // = 8
В итоге работать с битовыми масками стало намного удобней.
Пример из спецификации:
IntegerLiteral:
DecimalIntegerLiteral
HexIntegerLiteral
OctalIntegerLiteral
BinaryIntegerLiteralBinaryIntegerLiteral:
BinaryNumeral IntegerTypeSuffixoptBinaryNumeral:
0 b BinaryDigits
0 B BinaryDigitsBinaryDigits:
BinaryDigit
BinaryDigit BinaryDigitsAndUnderscoresopt BinaryDigitBinaryDigitsAndUnderscores:
BinaryDigitOrUnderscore
BinaryDigitsAndUnderscores BinaryDigitOrUnderscoreBinaryDigitOrUnderscore:
BinaryDigit
_BinaryDigit: one of
0 1
Другими словами формат такой: ноль (0), символ ‘b‘ или ‘B‘, затем последовательность чисел из 1 и 0, также между ними можно использовать знак подчеркивания ‘_’.
Что касается подчеркивания, то это тоже новшество Java 7. Скорее всего введено для улучшения человекочитаемости кода.
int a = 555_445_577;
int b = 0b1000_1111;
// а вот так, нельзя:
// int с = _123; Не скопилируется! error: illegal underscore
// int d = 456_; Не скопилируется! error: illegal underscore
2. Возможность ловить несколько разных исключений и более точная переброска.
Интересная доработка с обработкой исключений:
private static void multiCatch() throws IOException {
FileInputStream fis = new FileInputStream("/tmp/1.txt")
try {
fis.read();
} catch (FileNotFoundException | SecurityException e) {
throw e;
} finally {
fis.close();
}
}
Внешне это похоже на то как будто мы, через оператор ‘|’ (или) указываем
классы исключения, для которых стоит выполнять указанный код-обработки .
То есть в данном примере для FileNotFoundException и SecurityException.
Это позволяет в некоторых местах убрать дублирующийся код, а это уже хоть малая, но приятная победа над злом.
Второе новшество more precise rethrow – более интересное.
Рассмотрим такой пример кода:
private static void finalThrow() {
try {
throw new RuntimeException("test");
} catch (final Exception e) {
throw e;
}
}
Здесь в первую очередь сразу бросается в глаза final перед Exception!
Если бы мы попробовали скомпилировать такой код, в Java 6, то получили бы ошибку “… must be caught or declared to be thrown”!.
Здесь же, компилятор увидев final задумается, посмотрит на код и поймет, что на самом деле метод finalThrow() не должен кидать исключение Exception, и нет нужды в указании throws Exception для метода finalThrow().
Интрига на этом не заканчивается. Самое интересное то, что люди начали возмущаться! Зачем указывать final?!
Это дополнительный (лишний) смысл к этому ключевому слову!
В итоге, поведение без final по-умолчанию (если это возможно) аналогично тому, как если бы мы указали final.
Например:
private static void finalThrow() {
try {
throw new RuntimeException("test");
} catch ( /* final */ Exception e) {
// final можно не указывать.
throw e;
}
}
// НЕ СКОМПИЛИРУЕТСЯ!!!!!
private static void finalThrow2() {
try {
throw new RuntimeException("test");
} catch (Exception e) {
// поломали. e - не final!!!!!!
e = e;
throw e;
}
}
3. Упрощенный вызов методов с переменным количеством аргументов.
Это улучшение больше похоже на хак.
Сделали новую аннотацию: SafeVarargs
Это аннотация глушит предупреждения, которые мог бы выкидывать компилятор при использовании женериков вместе с вараргами.
Пример использования этой аннотации можно посмотреть в документации: Arrays.asList().
Если честно, относительно этой фичи, мне лень (и не интересно) расписывать все детали и ее хитросплетения.
Кому любопытно, подробнее, можно почитать здесь: http://blogs.oracle.com/darcy/entry/project_coin_safe_varargs