Статьи

Обзор возможностей Java 7

Ранее мы обсуждали все, что не попало в Java 7, а затем рассмотрели полезную инфраструктуру Fork / Join, которая его сделала.

В сегодняшнем посте мы рассмотрим все функции 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 .

Статьи по Теме :