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.