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
Příště: Opětovné volání výjimek a Anotace SafeVarargs.