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
01.
public
static
void
main(String[] args) {
02.
<strong>
try
(BufferedReader inputReader = Files.newBufferedReader(</strong>
03.
Paths.get(
new
URI(
"file:///C:/home/docs/users.txt"
)),
04.
Charset.defaultCharset());
05.
BufferedWriter outputWriter = Files.
06.
newBufferedWriter(Paths.get(
new
URI(
"file:///C:/home/docs/users.bak"
)),
07.
Charset.defaultCharset())) {
08.
String inputLine;
09.
while
((inputLine = inputReader.readLine()) !=
null
) {
10.
outputWriter.write(inputLine);
11.
outputWriter.newLine();
12.
}
13.
System.out.println(
"Copy complete!"
);
14.
}
15.
catch
(URISyntaxException | IOException ex) {
16.
ex.printStackTrace();
17.
}
18.
}
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
01.
try
(BufferedReader inputReader = Files.newBufferedReader(
02.
Paths.get(
new
URI(
"file:///C:/home/docs/users.txt"
)),
03.
Charset.defaultCharset())) {
04.
String inputLine;
05.
while
((inputLine = inputReader.readLine()) !=
null
) {
06.
System.out.println(inputLine);
07.
}
08.
}
09.
catch
(IOException | URISyntaxException ex) {
10.
ex.printStackTrace();
11.
}
Kdeždo starý zápis bez try-with-resources je daleko lépe čitelný:
Kód
01.
try
{
02.
Path path = Paths.get(
"users.txt"
);
03.
BufferedReader inputReader = Files.newBufferedReader(path, Charset.defaultCharset());
04.
String inputLine;
05.
while
((inputLine = inputReader.readLine()) !=
null
) {
06.
System.out.println(inputLine);
07.
}
08.
}
09.
catch
(IOException ex) {
10.
ex.printStackTrace();
11.
}
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
01.
import
java.io.*;
02.
03.
public
class
AssertionTest {
04.
05.
public
static
void
main(String argv[])
throws
IOException {
06.
System.out.print(
"Enter your marital status: "
);
07.
int
c = System.in.read();
08.
switch
((
char
) c) {
09.
case
's'
:
10.
case
'S'
:
11.
System.out.println(
"Single"
);
12.
break
;
13.
case
'm'
:
14.
case
'M'
:
15.
System.out.println(
"Married"
);
16.
break
;
17.
case
'd'
:
18.
case
'D'
:
19.
System.out.println(
"Divorced"
);
20.
break
;
21.
default
:
22.
assert
!
true
:
"Invalid Option"
;
23.
break
;
24.
}
25.
}
26.
}
V Java 7 byl přidán nový konstruktor, jenž umožňuje přiřadit uživatelsky generované chybě assertion zprávu.
Kód
1.
...
2.
if
(number>
10
) {
3.
throw
new
AssertionError(
"Number was too big"
,
new
4.
Throwable(
"Throwable assertion message"
));
5.
}
6.
...
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.