Статьи

Java 7: Project Coin в примерах кода

Этот блог знакомит с примерами кода некоторые новые функции Java 7, обобщенные термином Project Coin . Цель Project Coin — добавить набор небольших изменений языка в JDK 7. Эти изменения упрощают синтаксис языка Java. Меньше набора текста, более чистый код, счастливый разработчик ? Давайте посмотрим на это.

Предпосылки

Установите Java 7 SDK на свой компьютер
Установите Eclipse Indigo 3.7.1

Вы должны искать правильные пакеты для вашей операционной системы.

В вашем рабочем пространстве Eclipse вам нужно определить установленный Java 7 JDK в вашей среде выполнения. В Workbench перейдите в «Окно»> «Установки»> «Java»> «Установленные JRE» и добавьте домашний каталог Java 7.

Далее вам нужно установить уровень компилятора на 1.7 в Java> Compiler.

Монета проекта

Улучшенные литералы

Литерал — это представление исходного кода фиксированного значения.

«В Java SE 7 и более поздних версиях любое число символов подчеркивания (_) может появляться в любом месте между цифрами в числовом литерале. Эта функция позволяет вам разделять группы цифр в числовых литералах, что может улучшить читаемость вашего кода ». (из учебников по Java )

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
public class LiteralsExample { 
   
 public static void main(String[] args) { 
  System.out.println("With underscores: "); 
     
  long creditCardNumber = 1234_5678_9012_3456L; 
  long bytes = 0b11010010_01101001_10010100_10010010; 
     
  System.out.println(creditCardNumber); 
  System.out.println(bytes); 
     
  System.out.println("Without underscores: "); 
     
  creditCardNumber = 1234567890123456L; 
  bytes = 0b11010010011010011001010010010010; 
     
  System.out.println(creditCardNumber); 
  System.out.println(bytes); 
     
 

Обратите внимание на подчеркивания в литералах (например, 1234_5678_9012_3456L). Результаты записываются в консоль:

1
2
3
4
5
6
With underscores:  
1234567890123456 
-764832622 
Without underscores:  
1234567890123456 
-764832622 

Как видите, подчеркивания не имеют значения для значений. Они просто используются, чтобы сделать код более читабельным.

SafeVarargs

До JDK 7 вы всегда получали непроверенное предупреждение при вызове определенных методов библиотеки varargs. Без новой аннотации @SafeVarargs этот пример будет создавать непроверенные предупреждения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public class SafeVarargsExample { 
   
 @SafeVarargs 
 static void m(List<string>... stringLists) { 
  Object[] array = stringLists; 
  List<integer> tmpList = Arrays.asList(42); 
  array[0] = tmpList; // compiles without warnings 
  String s = stringLists[0].get(0); // ClassCastException at runtime 
 
   
 public static void main(String[] args) { 
  m(new ArrayList<string>()); 
 
    
}</string></integer></string> 

Новая аннотация в строке 3 не помогает обойти раздражающую ClassCastException во время выполнения. Также его можно применять только к статическим и конечным методам. Поэтому я считаю, что это не будет большой помощью. Будущие версии Java будут иметь ошибки времени компиляции для небезопасного кода, как в примере выше.

ромб

В Java 6 требовалось некоторое терпение, чтобы создать, скажем, список карт. Посмотрите на этот пример:

1
2
3
4
5
6
7
8
9
public class DiamondJava6Example {
   public static void main(String[] args) {
      List<Map<Date, String>> listOfMaps = new ArrayList<Map<Date, String>>(); // type information twice!
      HashMap<Date, String> aMap = new HashMap<Date, String>(); // type information twice
      aMap.put(new Date(), "Hello");
      listOfMaps.add(aMap);
      System.out.println(listOfMaps);
   }
}

Как вы можете видеть в правой части назначения в строках 3 и 4, вам нужно повторить информацию о вашем типе для переменной listOfMaps а также для переменной aMap . Это больше не нужно в Java 7:

1
2
3
4
5
6
7
8
9
public class DiamondJava7Example {
   public static void main(String[] args) {
      List<Map<Date, String>> listOfMaps = new ArrayList<>(); // type information once!
      HashMap<Date, String> aMap = new HashMap<>(); // type information once!
      aMap.put(new Date(), "Hello");
      listOfMaps.add(aMap);
      System.out.println(listOfMaps);
   }
}

Multicatch

В Java 7 вам не нужно условие catch для каждого отдельного исключения, вы можете перехватить несколько исключений в одном предложении. Вы помните код, как это:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
public class HandleExceptionsJava6Example { 
 public static void main(String[] args) { 
  Class string; 
  try
   string = Class.forName("java.lang.String"); 
   string.getMethod("length").invoke("test"); 
  } catch (ClassNotFoundException e) { 
   // do something 
  } catch (IllegalAccessException e) { 
   // do the same !! 
  } catch (IllegalArgumentException e) { 
   // do the same !! 
  } catch (InvocationTargetException e) { 
   // yeah, well, again: do the same! 
  } catch (NoSuchMethodException e) { 
   // ... 
  } catch (SecurityException e) { 
   // ... 
  
 

Начиная с Java 7 вы можете написать это так, что делает нашу жизнь намного проще:

01
02
03
04
05
06
07
08
09
10
public class HandleExceptionsJava7ExampleMultiCatch { 
 public static void main(String[] args) { 
  try
   Class string = Class.forName("java.lang.String"); 
   string.getMethod("length").invoke("test"); 
  } catch (ClassNotFoundException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { 
   // do something, and only write it once!!! 
  
 

Строка в выражениях switch

Начиная с Java 7 можно использовать строковые переменные в предложениях switch. Вот пример:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
public class StringInSwitch { 
 public void printMonth(String month) { 
  switch (month) { 
  case "April"
  case "June"
  case "September"
  case "November"
  case "January"
  case "March"
  case "May"
  case "July"
  case "August"
  case "December"
  default
   System.out.println("done!"); 
  
 

Попробуйте-с-ресурса

Эта функция действительно помогает сократить непредвиденные исключения во время выполнения. В Java 7 вы можете использовать так называемое предложение try-with-resource, которое автоматически закрывает все открытые ресурсы в случае возникновения исключения. Посмотрите на пример:

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
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
   
public class TryWithResourceExample { 
   
 public static void main(String[] args) throws FileNotFoundException { 
     
  // Java 7 try-with-resource 
     
  String file1 = "TryWithResourceFile.out"
  try (OutputStream out = new FileOutputStream(file1)) { 
   out.write("Some silly file content ...".getBytes()); 
   ":-p".charAt(3); 
  } catch (StringIndexOutOfBoundsException | IOException e) { 
   System.out.println("Exception on operating file " + file1 + ": " + e.getMessage()); 
  
     
  // Java 6 style 
     
  String file2 = "WithoutTryWithResource.out"
  OutputStream out = new FileOutputStream(file2); 
  try
   out.write("Some silly file content ...".getBytes()); 
   ":-p".charAt(3); 
  } catch (StringIndexOutOfBoundsException | IOException e) { 
   System.out.println("Exception on operating file " + file2 + ": " + e.getMessage()); 
  
   
  // Let's try to operate on the resources 
     
  File f1 = new File(file1); 
  if (f1.delete()) 
   System.out.println("Successfully deleted: " + file1); 
  else 
   System.out.println("Problems deleting: " + file1); 
   
  File f2 = new File(file2); 
  if (f2.delete()) 
   System.out.println("Successfully deleted: " + file2); 
  else 
   System.out.println("Problems deleting: " + file2); 
     
 

В строке 14 предложение try-with-resource используется для открытия файла, с которым мы хотим работать. Затем строка 16 генерирует исключение времени выполнения. Обратите внимание, что я не закрываю ресурс явным образом. Это делается автоматически при использовании try-with-resource. Это * не *, когда вы используете эквивалент Java 6, показанный в строках 21-30.

Код запишет в консоль следующий результат:

1
2
3
4
Exception on operating file TryWithResourceFile.out: String index out of range: 3 
Exception on operating file WithoutTryWithResource.out: String index out of range: 3 
Successfully deleted: TryWithResourceFile.out 
Problems deleting: WithoutTryWithResource.out 

Вот и все с точки зрения Project Coin. Очень полезные вещи в моих глазах.

Ссылка: «Java 7: Project Coin в примерах кода» от нашего партнера JCG Никласа.

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