Rozdíly mezi Java SE 6 a 7 (2)

Díl 2

Použití znaku podtržení v proměnných

Navazujeme na minulý díl, ve kterém jsme shrnuli stručnou historii Javy 7, JVM, invokedynamic a statement Switch.

Nově v Javě 7 můžete pro lepší čitelnost použít tam, kde je to dovoleno, v číselných proměnných znaky podtržení. Toto rozšíření jazyka nemá žádný jiný význam, než zlepšení čitelnosti kódu člověkem. Má však svá omezení, které je potřeba si zapamatovat.

  • Podtržení nelze použít na začátku proměnné. Proto není možné používat např. takto: long productKey = _12345_67890_09876_54321L;
  • Podtržení nelze použít na konci proměnné: long licenseNumber = 123_456_789_L;
  • Podtržení nelze použít ihned před či za desetinnou čárkou: float pi = 3._14_15F;

Podtržení lze vložit i do hexadecimálních či binárních proměnných:
int commandInHex = 0xE_23D5_8C_7;
int commandInBinary = 0b1110_0010001111010101_10001100_0111;

Try-With-Resources

Před Javou 7 musely být všechny zdroje (Resources, např.: java.io.InputStream nebo java.nio.Channel) správně otevřeny a uzavřeny. Aby se zjednodušilo zachytávání výjimek, byla do Javy 7 přidána deklarace bloku try-with-resources. Jakmile existuje blok TRY, budou na jeho konci všechny zdroje (resources) automaticky uzavřeny. Zdroje, deklarované uvnitř bloku try musí implementovat rozhraní java.lang.AutoCloseable. Tento přístup umožňuje psát úhlednější kód, jelikož není potřeba zanořovat další a další try-catch bloky. Jelikož se automaticky stará o zavírání zdrojů, je v literatuře tato implementace často nazývána ARM (Automated Resource Management – Automatické řízení zdrojů).

Kód

 public static void main(String[] args) {
    try (BufferedReader inputReader = Files.newBufferedReader(
    Paths.get(new URI("file:///C:/home/docs/users.txt")),
    Charset.defaultCharset());
    BufferedWriter outputWriter = Files.
    newBufferedWriter(Paths.get(new URI("file:///C:/home/docs/users.bak")),
    Charset.defaultCharset())) {
        String inputLine;
            while ((inputLine = inputReader.readLine()) != null) {
                outputWriter.write(inputLine);
                outputWriter.newLine();
            }
            System.out.println("Copy complete!");
        }
        catch (URISyntaxException | IOException ex) {
            ex.printStackTrace();
        }
    }

Aby bylo možno implementovat do Javy blok try-with-resources, byl do knihovny java.lang.Exception přidán nový konstruktor se dvěma metodami addSuppressed a getSuppressed. Výjimky tyku Suppressed jsou takové, které nejsou explicitně oznamovány.

Omezení try-with-resources

Tento přístup není vhodné používat, pokud používáte pouze jeden zdroj. Například tento kód je velmi těžko čitelný:

Kód

try (BufferedReader inputReader = Files.newBufferedReader(
    Paths.get(new URI("file:///C:/home/docs/users.txt")),
    Charset.defaultCharset())) {
        String inputLine;
        while ((inputLine = inputReader.readLine()) != null) {
            System.out.println(inputLine);
            }
        }
        catch (IOException | URISyntaxException ex) {
        ex.printStackTrace();
    }
            

Kdeždo starý zápis bez try-with-resources je daleko lépe čitelný:

Kód

try {
    Path path = Paths.get("users.txt");
    BufferedReader inputReader = Files.newBufferedReader(path, Charset.defaultCharset());
    String inputLine;
    while ((inputLine = inputReader.readLine()) != null) {
        System.out.println(inputLine);
        }
    }
catch (IOException ex) {
ex.printStackTrace();
}

Třída AssertionError v Java 7

Při psaní komplexnějšíchaplikací je vhodné používat Assertions. Assertion je zápis, který při testu porovnává výsledek s tvrzením, které očekáváte.

Například:

Kód

import java.io.*;

public class AssertionTest {

public static void main(String argv[]) throws IOException {
    System.out.print("Enter your marital status: ");
    int c = System.in.read();
    switch ((char) c) {
        case 's':
        case 'S':
            System.out.println("Single"); 
        break;
        case 'm':
        case 'M':
            System.out.println("Married");
        break;
        case 'd':
        case 'D':
            System.out.println("Divorced");
        break;
        default: 
            assert !true : "Invalid Option";
        break;
        }
    }
}

V Java 7 byl přidán nový konstruktor, jenž umožňuje přiřadit uživatelsky generované chybě assertion zprávu.

Kód

 ...
 if(number>10) {
 throw new AssertionError("Number was too big",new
 Throwable("Throwable assertion message"));
 }
...

Pokud v uvedeném kódu bude proměnná number větší než 10, vyvolá se výjimka:
Exception in thread "main" java.lang.AssertionError: Number was too big at Mujkod.main(Mujkod.java:5)
Caused by: java.lang.Throwable: Throwable assertion message

Zdroj

OCA OCP Java SE Programmer I & II Study Guide, Sierra K., Bates B.
Java 7 New Features Cookbook, Richard and Jennifer Reese
docs.oracle.com/javase

Příště: Opětovné volání výjimek a Anotace SafeVarargs.








Doporučujeme