Java 7 – Was ist neu?

Java7

Inzwischen ist schon einige Zeit verstrichen als Java 7 (JSR 336) gelauncht wurde. Dennoch wird der Großteil -gerade im Enterprise Bereich- aller Projekte noch mit der 6er Version entwickelt.
Die Einführung der 7er Version bringt natürlich neben Performance auch viele neue Entwicklungsmöglichkeiten mit sich. Ich möchte hier versuchen einige Java 7 Erneuerungen zu aggregieren.

String switch Anweisungen

Was bisher nur mit Enum oder primitiven Datentypen möglich war, ist nun auch bei Strings erlaubt.
Mit Java 7 lassen sich diese durch eine switch-case Anweisung behandeln. Stehen die in diesem Beispiel verwendeten Wochentage in Variablen, müssen sie final sein.

public int getWeekdayByName(String day) {
    switch (day) {
      case "Monday":    return 1;
      case "Tuesday":   return 2;
      case "Wednesday": return 3;
      case "Thursday":  return 4;
      case "Friday":    return 5;
      case "Saturday":  return 6;
      case "Sunday":    return 7;
      default:          return -1;
    }
  }

Multi-Catch

Müssen in einem try-catch Block mehrere Exception Typen behandelt werden, wird es oft unübersichtlich. Sieht sogar bei jedem Exceptionhandling die Verarbeitung gleich aus, entsteht schnell redundanter Code. Manch einer Entwickler neigt daher dazu den Typ Exception abzufangen. Meiner Meinung nach die schlechteste Wahl da hiermit auch nicht erwartete Exceptions abgefangen werden. Ganz selten ist dies hilfreich und angebracht, dies hält sich allerdings sehr in Grenzen und ist sehr anwendungsspezifisch.
Seit Java Version 7 können diverse Exception Typen getrennt von einer Pipe abgefangen werden. Der Code wird übersichtlicher und Redundanz gehört der Vergangenheit an.

public void multipleCatchException() {
    try {
      Thread.sleep(1000);
      int result = 10 / 0;
    } catch (InterruptedException | ArithmeticException e) {
      e.printStackTrace();
    }
  }

Diamond Operator

Wie lästig und redundant es doch immer war bei dem Anlegen einer Variable der Implementierung nochmals mehr den zuvor angegeben Typen zu übergeben. Diverse Bibliotheken wie Guava konnten dies bereits unterdrücken (List weekdays = Lists.newArrayList()).

List<String> myList = new ArrayList<String>()

Mit Java 7 ist dies nun auch ohne externe Bibliotheken möglich wobei sich die leere Klammer Diamond Operator schimpft.

List<String> myList = new ArrayList<>()

Unterstriche in Numbers

Neben der Binärdarstellung können in Zukunft auch Unterstriche in Numbers zur besseren Lesbarkeit verwendet werden.

int oneMillionJava6 = 1000000;
int oneMillionJava7 = 1_000_000;

long bytesJava6 = 0b000000010000000100000001;
long bytesJava7 = 0b00000001_00000001_00000001;

try-with-resources

Der lästige NULL check sowie das manuelle schließen der Streams im finally Block gehören ab sofort der Vergangenheit an. Die neue Umsetzung nennt sich „try-with-resources“ und übernimmt den close() Aufruf aller Ressourcen automatisch beim verlassen des try Blocks (quasi zwischen try und catch).

File input = new File("");
File output = new File("");
try (
    FileInputStream fileInputStream = new FileInputStream(input);
    FileOutputStream fileOutputStream = new FileOutputStream(output);
) {

  byte[] buffer = new byte[1024];
  int read;
  while ((read = fileInputStream.read(buffer)) != -1) {
    fileOutputStream.write(buffer, 0, read);
  }
} catch (IOException e) {
  e.printStackTrace();
}