В сегодняшнем посте мы рассмотрим все функции Project Coin — набор небольших языковых улучшений, которые не являются революционными, но, тем не менее, полезны для любого разработчика, способного использовать JDK 7.
Я придумал класс банковского счета, который демонстрирует основы возможностей Project Coin.
Взглянем…
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
public class ProjectCoinBanker { private static final Integer ONE_MILLION = 1_000_000; private static final String RICH_MSG = "You need more than $%,d to be considered rich."; public static void main(String[] args) throws Exception { System.out.println(String.format(RICH_MSG, ONE_MILLION)); String requestType = args[0]; String accountId = args[1]; switch (requestType) { case "displayBalance": printBalance(accountId); break; case "lastActivityDate" : printLastActivityDate(accountId); break; case "amIRich" : amIRich(accountId); break; case "lastTransactions" : printLastTransactions(accountId, Integer.parseInt(args[2])); break; case "averageDailyBalance" : printAverageDailyBalance(accountId); break; default: break; } } private static void printAverageDailyBalance(String accountId) { String sql = String.format(AVERAGE_DAILY_BALANCE_QUERY, accountId); try ( PreparedStatement s = _conn.prepareStatement(sql); ResultSet rs = s.executeQuery(); ) { while (rs.next()) { //print the average daily balance results } } catch (SQLException e) { // handle exception, but no need for finally to close resources for (Throwable t : e.getSuppressed()) { System.out.println("Suppressed exception message is " + t.getMessage()); } } } private static void printLastTransactions(String accountId, int numberOfTransactions) { List transactions = new ArrayList<>(); //... handle fetching/printing transactions } private static void printBalance(String accountId) { try { BigDecimal balance = getBalance(accountId); //print balance } catch (AccountFrozenException | ComplianceViolationException | AccountClosedException e) { System.err.println("Please see your local branch for help with your account."); } } private static void amIRich(String accountId) { try { BigDecimal balance = getBalance(accountId); //find out if the account holder is rich } catch (AccountFrozenException | ComplianceViolationException | AccountClosedException e) { System.out.println("Please see your local branch for help with your account."); } } private static BigDecimal getBalance(String acccountId) throws AccountFrozenException, AccountClosedException, ComplianceViolationException { //... getBalance functionality }} |
Вкратце, наш класс ProjectCoinBanker демонстрирует базовое использование следующих функций Project Coin.
- Подчеркивает в числовых литералах
- Строки в выключателе
- Multi-задвижка
- Вывод типа для создания типизированного объекта
- попробуй с ресурсами и исключенными исключениями
Прежде всего, подчеркивания в числовых литералах довольно понятны. Наш пример,
|
1
|
private static final Integer ONE_MILLION = 1_000_000; |
показывает, что выгода является визуальной. Разработчики могут быстро просмотреть код, чтобы убедиться, что значения соответствуют ожидаемым. Подчеркивания могут использоваться в местах, отличных от естественных группировок, и игнорируются, где бы они ни находились. Символы подчеркивания в числовых литералах не могут начинаться или заканчиваться числовым литералом, в противном случае вы можете разместить их там, где хотите. Хотя здесь это и не продемонстрировано, также добавлена поддержка двоичных букв. Точно так же, как шестнадцатеричные литералы имеют префикс 0x или 0X, двоичные литералы будут иметь префикс 0b или 0B.
Строки в переключателе также говорят сами за себя. Оператор switch теперь также принимает String. В нашем примере мы включаем аргумент String, передаваемый методу main, чтобы определить, какой запрос был сделан. Отметим, что это чисто реализация компилятора с указанием, что поддержка JVM для включения String может быть добавлена позднее.
Вывод типа — еще одно простое для понимания улучшение. Теперь вместо нашего старого кода
|
1
|
List<Transaction> transactions = new ArrayList<Transaction>(); |
мы можем просто сделать
|
1
|
List<Transaction> transactions = new ArrayList<>(); |
так как тип может быть выведен. Вероятно, не найдется никого, кто бы утверждал, что этого не должно было быть с момента появления дженериков, но сейчас это здесь.
Multi-catch окажется очень хорошим для краткости кода обработки исключений. Слишком много раз, когда мы действительно хотели что-то сделать на основе сгенерированного типа исключения, до сих пор мы были вынуждены иметь несколько блоков catch, выполняющих по существу одно и то же. Новый синтаксис очень чистый и логичный. Наш пример,
|
1
|
catch (AccountFrozenException | ComplianceViolationException | AccountClosedException e) |
показывает, как легко это можно сделать.
Наконец, последняя демонстрация функции Project Coin — это попытка использования синтаксиса ресурсов и поддержка извлечения исключенных исключений. Был представлен новый интерфейс, AutoCloseable , который был применен ко всем ожидаемым подозреваемым, включая Input / OutputStreams, Readers / Writers, Channels, Sockets, Selectors и java.sql ресурсы Statement, ResultSet и Connection. На мой взгляд, синтаксис не такой естественный, как было с изменением мульти-улова, не то чтобы я имел в виду альтернативу.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
try ( PreparedStatement s = _conn.prepareStatement(sql); ResultSet rs = s.executeQuery(); ) { while (rs.next()) { //print the average daily balance results }} catch (SQLException e) { //handle exception, but no need for finally to close resources for (Throwable t : e.getSuppressed()) { System.out.println("Suppressed exception message is " + t.getMessage()); }} |
Сначала мы видим, что мы можем включить несколько ресурсов в попытку с ресурсами — очень приятно. Мы даже можем ссылаться на ранее объявленные ресурсы в том же блоке, что и в нашем PreparedStatement. Мы по-прежнему обрабатываем наше исключение, но нам не нужно иметь блок finally только для того, чтобы закрыть ресурсы. Также обратите внимание, что в Throwable есть новый метод getSuppressed () . Это позволяет нам получить доступ к любым исключениям, которые были сгенерированы при попытке «автоматически закрыть» объявленные ресурсы. В каждом объявленном ресурсе может быть не более одного исключенного исключения. Примечание: если инициализация ресурса вызывает исключение, оно будет обработано в объявленном вами блоке catch.
Вот и все. Ничего потрясающего, но некоторые простые улучшения, которые мы все можем начать использовать без особых проблем. Project Coin также включает в себя функцию, касающуюся varargs и предупреждений компилятора. По сути, это сводится к новой аннотации (@SafeVarargs), которая может быть применена в объявлении метода, чтобы позволить разработчикам удалить @SuppressWarnings («varargs») из своего потребляющего кода. Это применимо ко всем ключевым подозреваемым в JDK, но такая же аннотация доступна вам в любом из ваших обобщенных методов varags.
Набор функций Project Coin, описанный в Интернете, в лучшем случае противоречив. Надеемся, что это даст вам общее представление о том, что вы можете использовать из предложения в JDK 7.
Ссылка: Java 7 — Обзор возможностей Project Coin от наших партнеров JCG в блоге Carfey Software .