Wybrane elementy jezyka Java - PowerPoint PPT Presentation

About This Presentation
Title:

Wybrane elementy jezyka Java

Description:

Wybrane elementy j zyka Java Pawe Zdziarski Wyj tki Reflection Tworzenie i zarz dzanie obiektami Garbage Collector i finalize() Nowe elementy Javy 1.5 Typy ... – PowerPoint PPT presentation

Number of Views:86
Avg rating:3.0/5.0
Slides: 41
Provided by: mimuwEduP3
Category:

less

Transcript and Presenter's Notes

Title: Wybrane elementy jezyka Java


1
Wybrane elementy jezyka Java
  • Pawel Zdziarski

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

3
Wyjatki
  • Obsluga bledów semantycznych (runtime) w sposób
    efektywniejszy niz zwracanie kodu bledu metody
  • Podnoszenie wyjatku
  • Wywolanie metody podnoszacej wyjatek (throws)
  • Explicite klauzula throw

4
Obsluga 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

5
Obsluga 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

6
Przyczyny 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 )

7
Hierarchia 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

8
Error 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

10
Pakiet 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

12
Konstruktory
  • 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()

13
Wyrazenie.super()
  • Tzw. kwalifikowane wywolanie konstruktora
    nadklasy. Przyklad ze specyfikacji jezyka
  • class Outer
  • class Inner
  • class ChildOfInner extends Outer.Inner
  • ChildOfInner() (new Outer()).super()

14
Jak 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

16
GC 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

17
Osiagalnosc 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

18
finalization
  • 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

20
interface 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
21
Typy 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

22
Typy 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

23
Dynamiczna 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

24
Typy 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!

25
Typy 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)

26
Typy 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

28
Covariant 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

30
System 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

32
Iterowanie 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()

33
Petla 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

35
Bezpieczne (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

37
Statyczne 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

39
Zmienna 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

40
Literatura 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
Write a Comment
User Comments (0)
About PowerShow.com