Title: Wybrane elementy jezyka Java
1Wybrane elementy jezyka Java
2- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
3Wyjatki
- Obsluga bledów semantycznych (runtime) w sposób
efektywniejszy niz zwracanie kodu bledu metody - Podnoszenie wyjatku
- Wywolanie metody podnoszacej wyjatek (throws)
- Explicite klauzula throw
4Obsluga wyjatków
- Wyjatki sa zgodnie z definicja jezyka precise
zoptymalizowana implementacja moze wykonac czesc
instrukcji naprzód, ale w przypadku zgloszenia
wyjatku musi zadbac o to, zeby w widocznym stanie
wykonania (user-visible state) wyliczone byly
dokladnie te wyrazenia, które wystapily przed
wyrazeniem podnoszacym wyjatek - Znajdowana jest klauzula catch bloku try-catch
dynamicznie zawierajacego generujace wyjatek
wyrazenie
5Obsluga wyjatków
- Jaki bedzie rezultat wykonania
- try
- try throw new Exception1()
- catch(Exception1 e)
- System.out.println("Wewnetrzny catch
e.toString()) - throw new Exception2()
-
- finally throw new Exception3()
- catch (Exception e)
- System.out.println("Zewnetrzny catch
e.toString())
- Blok try-catch-finally ma jeden atrybut
propagowany dalej wyjatek. Zgodnie z definicja
jezyka, wewnetrzny blok w tym przykladzie bedzie
propagowal wyjatek klasy Exception3, a wiec - Wewnetrzny catch mypackage18.Application1Excepti
on1 - Zewnetrzny catch mypackage18.Application1Excepti
on3
6Przyczyny powstania wyjatku
- Blad wykonania JVM wyjatek zglaszany
synchronicznie - Operacja niezgodna z semantyka jezyka (np.
java.lang.ArithmeticException ) - Blad ladowania/linkowania programu (
NoClassDefFound ) - Brak zasobu ( OutOfMemoryError,
NoRouteToHostException ) - Jawne uzycie klauzuli throw
- Wyjatek podnoszony asynchronicznie
- Moze wystapic potencjalnie w dowolnym punkcie
wykonania biezacego watku - Inny watek wywoluje stop()
- Wewnetrzny blad JVM ( VirtualMachineError )
7Hierarchia wyjatków
- checked (podklasy Exception nie bedace
RuntimeException) musza byc wyspecyfikowane w
klauzuli throws metody lub konstruktora
kompilator wymusza implementowanie obslugi takich
wyjatków - Unchecked kompilator nie wymusza na
programiscie obslugi (ani deklaracji throws) - RuntimeException (np. ArithmeticException,
NullPointerException) - kompilator nie ma
mozliwosci posluzenia sie zaawansowanymi
technikami dowodzenia poprawnosci programów i
nie moze przez to stwierdzic, czy dany ciag
instrukcji moze wygenerowac taki wyjatek lub nie - Error (np. OutOfMemoryError extends
VirtualMachineError) mamy do czynienia z
nienormalnym (abnormal) stanem JVM
8Error jest osobna, dziedziczaca po Throwable
klasa dzieki temu wszystkie wyjatki, które da
sie jakos obsluzyc, mozna potraktowac
konstrukcja catch (Exception e)
9- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
10Pakiet java.lang.reflect
- Dostep do obiektów reprezentujacych konstrukcje
samego jezyka - Obiekt Class (pakiet java.lang) reprezentuje
zaladowana postac binarna klasy uzycie - public static Class forName(String className)
throws ClassNotFoundException - Method reprezentuje metode klasy lub interfejsu
- Class c Class.forName(nazwaKlasy)
- Method m c.getDeclaredMethods()
- for (int i 0 i lt m.length i)
System.out.println(mi.toString()) - Analogiczne uzycie obiektów klas Field,
Constructor - Interfejs Member implementowany przez Field,
Constructor, Class i Method udostepnia metode
getModifiers()
11- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
12Konstruktory
- W kodzie konstruktora pierwsza instrukcja moze,
opcjonalnie, byc explicite wywolaniem
konstruktora. Wpp domyslnie super() jest pierwsza
instrukcja kodu konstruktora - Explicite wywolania konstruktora
- this(ltlista_argumentowgt)
- super(ltlista_argumentowgt)
- ltwyrazeniegt.super()
13Wyrazenie.super()
- Tzw. kwalifikowane wywolanie konstruktora
nadklasy. Przyklad ze specyfikacji jezyka - class Outer
- class Inner
- class ChildOfInner extends Outer.Inner
- ChildOfInner() (new Outer()).super()
-
14Jak wykonywana jest konstrukcja wyrazenie.super()
?
- Rozwazamy konstrukcje
- class O
- class S
-
- class C extends O.S
- C() wyrazenie.super(argumenty)
ciag_pozostalych_instrukcji_konstruktora -
- wyrazenie jest wyliczane. Jesli jego wartoscia
jest null, wywolanie konstruktora nadklasy konczy
sie wyjatkiem NullPointerException - Niech O bedzie klasa bezposrednia otaczajaca
statycznie (leksykalnie) klase (C), w której
konstruktorze wystapila konstrukcja
wyrazenie.super - Jesli wartoscia wyrazenia nie jest obiekt klasy O
ani podklasy klasy O, generowany jest blad
kompilatora - Wyrazenia argumenty sa wyliczane, od lewej do
prawej - Konstruktor jest wywolywany
15- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
16GC i finalization
- Srodowisko uruchomieniowe Javy utrzymuje tablice
referencji do obiektów. - Referencja jest usuwana, gdy obiekt przestaje byc
widoczny - Jawne przypisanie null do zmiennej
- Gdy nie ma wiecej referencji do obiektu,
- Finalization uzycie System.runFinalization()
wywola finalize() dla wszystkich obiektów
czekajacych na postprzatanie - Garbage collection uzycie System.gc() jawnie
uruchamia GC
17Osiagalnosc referencji
- Wyznaczanie zbioru referencji nieosiagalnych
(unreachable) dla zadnego z watków programu - Jesli wszystkie referencje do obiektu pochodza z
obiektów nieosiagalnych, sam obiekt jest
nieosiagalny - Uwaga dodatkowe warunki jesli uzywamy JNI
18finalization
- finalize() zaimplementowana w Object (jako pusta
metoda), programista moze ja przeslonic - public class ProcessFile
- protected void finalize() throws Throwable
- try
- file.close()
-
- finally
- super.finalize()
-
- (ciekawostka) w J2ME brak metod zwiazanych z
garbage collection jawne przypisanie null moze
zasugerowac GC mozliwosc posprzatania obiektu - Reference Objects and Garbage Collection,
artykul na stronie http//developer.java.sun.com/d
eveloper/technicalArticles/ALT/RefObj/
19- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
20interface ActionltE extends Exceptiongt void
run() throws E class AccessController public
static ltE extends Exceptiongt void exec(ActionltEgt
action) throws E action.run() public
class Main public static void
main(String args) try
AccessController.exec ( new
ActionltFileNotFoundExceptiongt() public
void run() throws FileNotFoundException
someFile.delete() // new Action
... ) // AccessController.exec() //
koniec bloku try catch
(FileNotFoundException e) // koniec
metody main() // koniec class Main
21Typy sparametryzowane i JVM
- Programy uzywajace generics sa tlumaczone do
bytecodeu Javy, wykonywanego przez JVM - Proces nazywany erasure polega na mapowaniu typów
generycznych do typów niesparametryzowanych - Niech T oznacza erasure typu T, zachodza wtedy
m.in. - T ltT1,...,Tngt T
- T T
- Dokladny opis mechanizmu erasure, tlumaczenia
metod i wyrazen w Adding Generics to the Java
Programming Language Participant Draft
Specification, dostepnym np. ze strony
java.sun.com
22Typy sparametryzowane i tablice
- Bez generics tablice maja nastepujaca wlasnosc
- Tablica referencji nadtypu jest nadtypem tablicy
referencji podtypu - Wynika stad np. to, ze Object jest nadtypem
String - Mozemy dzieki temu m.in. napisac
- Object objArr new String10
- Brak analogicznej wlasnosci w przypadku typów
sparametryzowanych - LinkedListltObjectgt objList new
LinkedListltStringgt() - daje blad kompilacji
23Dynamiczna informacja o typie i array store check
- Tablice w Javie zawsze posiadaja dynamiczna
informacje o typie przechowywanych w nich
obiektów - W czasie wykonywania operacji na tablicach
wykonywany jest tzw. array store check, który
moze spowodowac zgloszenie ArrayStoreException - Object objArr new String10
- objArr0 new Object()
- kompiluje sie, ale w czasie wykonania zglasza
wyjatek - Programista moze zakladac, ze tablica zawiera
elementy tego samego typu (albo podtypów tego
typu) - Store check nie jest w ogóle wykonywany w
przypadku kolekcji typów sparametryzowanych, bo
ponizszy kod - LinkedListltObjectgt objList new
LinkedListltStringgt() - w ogóle sie nie skompiluje
24Typy sparametryzowane i tablice
- Tablice typów sparametryzowanych nie sa
dopuszczalne ze wzgledów bezpieczenstwa - class BoxltTgt final T xBox(T x) this.x
xBoxltStringgt niebezpiecznaTablica new
BoxltStringgt3Object tablicaObiektow
niebezpiecznaTablicatablicaObiektow0 new
BoxltIntegergt(3) / blad nie znajdowany przez
tzw. array store check / - String s niebezpiecznaTablica0.x // BOOM!
25Typy sparametryzowane i rzutowanie
- Kompilator nie zna typu sparametryzowanego
przed uruchomieniem programu - zadanie utrzymania poprawnosci rzutowan do typu
parametrycznego nalezy do programisty - static Integer foo() Double d new
Double(1.0)return (Integer) d - Powyzszy kod nie kompiluje sie z bledem
inconvertible types (znaleziono Double,
oczekiwano Integer)
26Typy sparametryzowane i rzutowanie
public class BadCast static ltTgt T foo()
Double d new Double( 1.0 )return ( T )
dpublic static void main( String args )
System.out.println( BadCast.ltIntegergtfoo() )
- Powyzszy program nie generuje ostrzezen
kompilatora i wykonuje sie dajac... - 1.0
- !!!
- Dla przypomnienia
- class Number extends Object
- class Integer extends Number
- class Double extends Number
- Kompilator zauwazylby blad przy rzutowaniu,
jesli w kodzie funkcji foo() napisalibysmy po
prostu return d - Kompilator nie generuje bledu, jesli napiszemy
return (T) d
27- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
28Covariant return types
- Do wersji 1.4 jezyka przeslaniajaca
implementowana w nadklasie metoda podklasy
musiala miec identyczna sygnature w
szczególnosci, zwracany typ - Ponizszy kod nie kompiluje sie w JRE 1.4.1_02
- class Fruit implements Cloneable
- Fruit copy() throws CloneNotSupportedException
return (Fruit) clone() -
- class Apple extends Fruit implements Cloneable
- Apple copy() throws CloneNotSupportedException
return (Apple) clone() -
- Wywolujac clone() na obiekcie Apple dostajemy
obiekt nadklasy Fruit i musimy niepotrzebnie
rzutowac w dól do Apple - Java 1.5 dopuszcza taka konstrukcje
29- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
30System typów i autoboxing
- Typy proste (primitives) i referencyjne (obiekty)
- Czasem konstrukcja wymaga uzycia typu
referencyjnego - Jako typu parametryzujacego szablon
- Jako obiektów kolekcji np. List
- Konieczne rzutowania
- list.add(new Integer(1))
- int i ((Integer)list.get(0)).intValue()
- Autoboxing / autounboxing robi to automatycznie
- Integer integer new Integer(1)
- integer 1
31- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
32Iterowanie po elementach kolekcji
- Dotychczas (Java 1.4) uzywamy konstrukcji typu
- public void drawAll (Collection c)
- Iterator itr c.iterator()
- while (itr.hasNext())
- ((Shape)itr.next()).draw()
-
-
- Uzywajac typów parametrycznych, mozemy
zaoszczedzic sobie kodowania kilku rzutowan - public void drawAll (CollectionltShapegt c)
- IteratorltShapegt itr c.iterator()
- while (itr.hasNext())
- itr.next().draw()
-
-
33Petla foreach generics
- Nowa dopuszczalna postac petli for
- public void drawAll(CollectionltShapegt c)
- for (Shape sc)
- s.draw()
-
- Rozwijane automatycznie do kodu
- for (IteratorltShapegt i c.iterator()
i.hasNext()) - Shape s i.next()
- s.draw()
34- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
35Bezpieczne (type-safe) typy wyliczeniowe
- Dotychczas
- class Movement
- public static final int UP 0
- public static final int LEFT 1
- public static final int DOWN 2
- public static final int RIGHT 3
-
- Wywolanie metody oczekujacej parametru takiego
typu wyliczeniowego z parametrem np. 5 nie
wygeneruje bledu kompilacji - Nowa konstrukcja enum
-
- class Movement
- public enum Direction up, left, down, right
-
36- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
37Statyczne import
- Po uzyciu
- import static java.lang.Math.
- mozemy pisac po prostu
- int i abs(-1)
- zamiast kwalifikowac dodatkowo nazwa pakietu
- int i Math.abs(-1)
- Potencjalne bledy kompilacji w przypadku
powstajacej w ten sposób dwuznacznosci nazw
38- Wyjatki
- Reflection
- Tworzenie i zarzadzanie obiektami
- Garbage Collector i finalize()
- Nowe elementy Javy 1.5
- Typy sparametryzowane
- Covariant return types
- autoboxing
- Petla w stylu foreach
- Bezpieczne (type-safe) enumeracje
- Statyczne import
- Metody ze zmienna liczba parametrów
39Zmienna liczba argumentów
- public static int sum(int args...)
- int sum 0
- for (int x args ) / uzycie wczesniej
przedstawianej konstrukcji foreach / - sum x
- return sum
40Literatura i URLs
- Wprowadzenie do uzycia Generics
- http//developer.java.sun.com/developer/technicalA
rticles/releases/generics/ - Artykul o tablicach typów sparametryzowanych
- http//www.langer.camelot.de/Articles/Java/JavaGen
erics/ArraysInJavaGenerics.htm - The Java Language Specification, dostepna z
java.sun.com