Stel we definieren de volgende methoden.
Vanuit eerste perspectief lijken funcA en funcB hetzelfde te functioneren. Overigens vind ik funcA er cleaner uitzien.
Wat ik me nu afvraag is het volgende. De compiler mag onder bepaalde voorwaarde code reordering uitvoeren. Mag de compiler dan van funcA het volgende maken:
Oftwel regel 2 en 3 omgedraaid van de oorspronkelijk code. Bij normale executie blijft het gedrag namelijk hetzelfde als de oorspronkelijke code. Echter, er zal een probleem optreden zodra er een resource is 'acquired' en er een runtime exceptie optreed in prepareSomethings(), zodat de resource nooit meer gereleased gaat worden!! (Immers, het try-finally block zal dan als geheel worden overgeslagen). Mag ik daarom stellen dat de compiler deze reordering nooit zal toepassen?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| public void funcA() { prepareSomethings(); //might throw an unchecked exception Resource resource = acquireResource(); //might also throw an unchecked exception try { doStuff(resource); } finally { resource.release(); } } public void funcB() { prepareSomethings(); //might throw an unchecked exception Resource resource = null; try { resource = acquireResource(); //might also throw an unchecked exception doStuff(resource); } finally { if (resource != null) { resource.release(); } } } |
Vanuit eerste perspectief lijken funcA en funcB hetzelfde te functioneren. Overigens vind ik funcA er cleaner uitzien.
Wat ik me nu afvraag is het volgende. De compiler mag onder bepaalde voorwaarde code reordering uitvoeren. Mag de compiler dan van funcA het volgende maken:
code:
1
2
3
4
5
6
7
8
9
| public void funcA_compilerOptimized() { Resource resource = acquireResource(); //might also throw an unchecked exception prepareSomethings(); //might throw an unchecked exception try { doStuff(resource); } finally { resource.release(); } } |
Oftwel regel 2 en 3 omgedraaid van de oorspronkelijk code. Bij normale executie blijft het gedrag namelijk hetzelfde als de oorspronkelijke code. Echter, er zal een probleem optreden zodra er een resource is 'acquired' en er een runtime exceptie optreed in prepareSomethings(), zodat de resource nooit meer gereleased gaat worden!! (Immers, het try-finally block zal dan als geheel worden overgeslagen). Mag ik daarom stellen dat de compiler deze reordering nooit zal toepassen?