Java 5.0. Nowości w języku

Podobne dokumenty
Programowanie obiektowe

Programowanie obiektowe

Programowanie obiektowe

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Programowanie w języku Java

Programowanie obiektowe

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Dokumentacja do API Javy.

Dawid Gierszewski Adam Hanasko

Wykład 7: Pakiety i Interfejsy

Aplikacje w środowisku Java

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

1 Atrybuty i metody klasowe

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Dziedziczenie. dr Jarosław Skaruz

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Programowanie obiektowe

Programowanie w Internecie. Java

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

TYPY GENERYCZNE (GENERICS)

Programowanie obiektowe

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Ćwiczenie 1. Przygotowanie środowiska JAVA

Polimorfizm. dr Jarosław Skaruz

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Pakiety i interfejsy. Tomasz Borzyszkowski

Java: interfejsy i klasy wewnętrzne

Java niezbędnik programisty spotkanie nr 9. Java 2 Platform, Standard Edition 5.0

Programowanie obiektowe zastosowanie języka Java SE

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Java w 21 dni / Rogers Cadenhead. Gliwice, cop Spis treści. O autorze 11. Wprowadzenie 13 TYDZIEŃ I JĘZYK JAVA

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wywoływanie metod zdalnych

Javadoc. Piotr Dąbrowiecki Sławomir Pawlewicz Alan Pilawa Joanna Sobczyk Alina Strachocka

Programowanie obiektowe

Diagramy klas. dr Jarosław Skaruz

Platformy Programistyczne Podstawy języka Java

Programowanie obiektowe

Języki i metody programowania Java. Wykład 2 (część 2)

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie obiektowe

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Aplikacje RMI

Wykład 4: Klasy i Metody

Klasy abstrakcyjne i interfejsy

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Języki i techniki programowania Ćwiczenia 4 Wzorce

Wykład 8: Obsługa Wyjątków

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Programowanie obiektowe

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Programowanie obiektowe

Wykład 2: Podstawy Języka

Podstawy języka Java. przygotował:

Metody dostępu do danych

Enkapsulacja, dziedziczenie, polimorfizm

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Spis treści. 1 Java T M

Polimorfizm a klasy generyczne w języku Java. Zdzisław Spławski 1

Programowanie Obiektowe Ćwiczenie 4

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Projektowanie aplikacji internetowych laboratorium

Programowane refleksyjne i serializacja

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

2. Składnia, środowisko i konwencje w Javie

Programowanie w Javie cz. 1 Wstęp. Łódź, 24 luty 2014 r.

Wywoływanie metod zdalnych

TEMAT : KLASY DZIEDZICZENIE

Tworzenie aplikacji w języku Java

Java niezbędnik programisty spotkanie nr 10. Typy wyliczeniowe, auto. opakowywanie/odpakowywanie,...

Programowanie obiektowe

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Klasy i obiekty cz II

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Wykład 6: Dziedziczenie

Aplikacje w środowisku Java

Transkrypt:

Java 5.0 Nowości w języku

Wstęp Nowa wersja Javy, oznaczona 5.0 (1.5 wg. wewnętrznej numeracji Sun) wyszła 29 września 2004 roku. Określana jako najbardziej innowacyjna edycja Javy od czasu wyjścia języka.

O czym będę mówił Ograniczam temat do nowości w języku, bez omawiania nowości w Wirtualnej Maszynie Javy, bibliotekach itd.. Duży nacisk na typy generyczne oraz na machanizm metadanych (annotations)

Historia 4 grudnia 1998 r. J2SE 1.2 Playground 8 maja 2000 r. J2SE 1.3 Kestler 12 luty 2002 r. J2SE 1.4 Merlin 29 września 2004 r. J2SE 5.0 (1.5) Tiger

Zmiany w języku Typy generyczne Typy wyliczeniowe Nowa pętla for Mechanizm zmiennej liczby argumentów Autoboxing/Unboxing Statyczny import Mechanizm metadanych

Nowa pętla For Nowa, ładniejsza metoda przechodzenia po kolekcjach. Do tej pory przejście wyglądało mniej więcej tak: void cancelall(collection<timertask> c) { for (Iterator<TimerTask> i = c.iterator(); i.hasnext(); ) i.next().cancel(); }

Nowa pętla For Z użyciem nowej pętli: void cancelall(collection<timertask> c) { for (TimerTask t : c) t.cancel(); }

Nowy For kiedy stosować Zalecana zawsze, kiedy tylko można. Nie da się zastosować jeżeli we wnętrzu pętli potrzebujemy dostęp do iteratora, np. do filtrowania kolekcji.

Typy generyczne wstęp Nowy mechanizm, znany już z innych języków. Największe zastosowanie: różnego rodzaju kontenery obiektów, np. kolekcje. Powody wprowadzenia: Umożliwia tworzenie klas nieograniczanych typami danych Wymuszenie zgodności typów Zwiększenie przejrzystości kodu

Typy generyczne Lista w starej wersji List myintlist = new LinkedList(); myintlist.add(new Integer(0)); Integer x = (Integer) myintlist.iterator().next(); Lista z typami generycznymi List<Integer> myintlist = new LinkedList<Integer>(); myintlist.add(new Integer(0)); Integer x = myintlist.iterator().next();

Typy generyczne tylko mniej pisania? Sprawdzanie zgodności typów w momencie kompilacji, nie działania programu. Wymusza utrzymanie zależności pomiędzy obiektami Pokazuje zamiar programisty

Typy generyczne Definiowanie samemu klasy działającej na typach generycznych public interface List<E> { void add(e x); Iterator<E> iterator(); } Mechanizm inny niż ten z C++! Nie tworzy osobnej klasy przy każdym ukonkretnieniu. Nie umożliwia metaprogramowania.

Typy generyczne - dziedziczenie Problem czy jeżeli B jest podklasa A, a C klasa generyczna, to C<B> jest podklasa C<A>. Przykład: czy List<Integer> jest też List<Object>? List<String> ls = new ArrayList<String>(); List<Object> lo = ls; lo.add(new Object()); String s = ls.get(0);

Typy generyczne - wildcards Poprzednia własność komplikuje operowanie na kolekcjach nieznanego typu, np. przejść i wypisać wszystkie elementy kolekcji. void printcollection(collection<object> c) { for (Object e : c) { System.out.println(e); }}

Typy generyczne - wildcards Aby jednak umożliwić działanie na nieznanych kolekcjach wprowadzono mechanizm wildcards: <?> = nieznane. void printcollection(collection<?> c) { for (Object e : c) { System.out.println(e); }} To już działa

Typy generyczne - wildcards Nie wszystko jest dozwolone przy stosowaniu wildcards: Collection<?> c = new ArrayList<String>; c.add(new Object());

Typy generyczne wildcards Można wprowadzać ograniczenia na klasy, do jakich <?> będzie pasować. Przykład: klasa Ksztalt z podklasami Kolo i Kwadrat void drawall(collection<? extends Ksztalt> c) {... }

Metody generyczne Sytuacje, kiedy nie można użyć wildcards metoda na nieznanych kolekcjach, ale musząca je modyfikować. Przykład: static <T> void fromarraytocollection(t[] a, Collection<T> c) { for (T o : a) { c.add(o); }} Warto wiedzieć: Nie trzeba podawać ukonkretniania przy korzystaniu z takiej metody jest to zadanie kompilatora żeby znaleźć najbardziej dokładne ukonkretnienie.

Typy generyczne kiedy znikają? Mechanizm typów generycznych jest stosowany w momencie kompilacji. Kompilator dokonuje sprawdzania zgodnosci typów

Kompilacja typu generycznego Kompilator zna informacja o typie dla klasy Jest to też zachowane dla Reflection Niewykorzystywane w działającym programie Usuwane z sygnatur metod Informacja o typie nie jest zachowywana w instancjach klasy Parametryzacja jest znana tylko dla kompilatora W momencie działania programu List foo jest tym samym co List<bar> foo.

Autoboxing/Unboxing Przerzucono z programisty na kompilator zadanie opakowywania wartości typów pierwotnych przy operacjach na kolekcjach. Kiedyś: ArrayList<Integer> list = new ArrayList<Integer>(); list.add(0, new Integer(42)); int total = (list.get(0)).intvalue(); Teraz: ArrayList<Integer> list = new ArrayList<Integer>(); list.add(0, 42); int total = list.get(0);

Typ wyliczeniowy Rozwiązania stosowane do tej pory: Ręczne wyliczenie na wartościach całkowitych: public static final int SEASON_WINTER = 0; public static final int SEASON_FALL = 1; Typesafe enum: public final class Enum { public static final Enum TRUE = new Enum (); public static final Enum FALSE = new Enum (); private Enum () {} }

Typ wyliczeniowy wady poprzednich rozwiązań Ręczne wyliczanie wartości: Brak ochrony typu Brak przestrzeni nazw Wypisane wartości są bezużyteczne Typesafe Enum Nie można użyć przy switch Źle znoszą serializację

Typ wyliczeniowy Nowy mechanizm wyliczeniowy: enum Season { WINTER, SPRING, SUMMER, FALL }; Każdy typ wyliczeniowy posiada metodę values() zwracającą tablicę wartości.

Typ wyliczeniowy Typ Enum jest normalną klasą można dodawać dodatkowe dane, dodawać specyficzne zachowanie, implementować interfejsy itd. Interfejsy Serializable i Comparable są od razu implementowane. public enum Planet { EARTH (5.976e+24, 6.37814e6), MARS (6.421e+23, 3.3972e6), } private final double mass; // in kilograms private final double radius; // in meters Planet(double mass, double radius) { this.mass = mass; this.radius = radius; } public double mass() { return mass; } public double radius() { return radius; } // universal gravitational constant (m3 kg-1 s-2) public static final double G = 6.67300E-11; public double surfacegravity() { return G * mass / (radius * radius); } public double surfaceweight(double omass) { return omass * surfacegravity(); }

Varargs Mechanizm znany już z rodziny C. Do tej pory do zmiennej liczby argumentów potrzebna była tablica. Z nowym mechanizmem: public static String format(string pattern, Object... arguments); oznacza możliwość wystąpienia w tym miejscu sekwencji lub tablicy argumentów.

Static import Do tej pory sięganie do klasowych pól i metod wymuszało wpisanie nazwę klasy. double r = Math.cos(Math.PI * theta); Korzystając z mechanizmu static import można pominąć takie prefiksowanie: import static java.lang.math.*; double r = cos(pi * theta);

Metadane Metadane były już obecne w poprzednich wersjach Javy np. javadoc. Duże wzmocnienie i uelastycznienie tego mechanizmu. Dodano nowe znaczniki Umożliwienie użytkownikowi definiowanie własnych znaczników

Metadane po co wprowadzono? Bardziej deklaratywne programowanie Automatyczne tworzenie standardowego kodu wymaganego przez niektóre API (np. JAX-RPC) Możliwość automatycznego tworzenia wielu zgodnych ze sobą plików na podstawie tylko jednego pliku.

Annotacje Przykłady annotacji: @Preliminary public class TimeTravel {... } @Copyright("2002 Yoyodyne Propulsion Systems") public class OscillationOverthruster {... } @RequestForEnhancement( id = 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody", date = "4/1/3007" ) public static void travelthroughtime(date destination) {... }

Definiowanie annotacji Jak zdefiniować własną annotację: Każda metoda definiuje jedno pole Metody nie mogą przyjmować argumentów Możliwe zwracane typy: Typy pierwotne String Class annotacja Typy wyliczeniowe Tablice powyższych public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned]"; String date() default "[unimplemented]"; }

Metadane Annotacje można podawać wszędzie tam, gdzie inne modyfikatory (np. public, private). W dobrym tonie jest podawać je jako pierwsze. Znaczniki można podawać bez nawiasów Annotacje z jednym polem nazwanym value: można w nawiasach podać tylko wartość pola Annotacje z wieloma polami wymienia się je w postaci nazwa = wartość; @Preliminary public class TimeTravel {... } @Copyright("2002 AP Company") public class OscillationOverthruster {... } @RequestForEnhancement( id = 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody", date = "4/1/3007" ) public static void travelthroughtime(date destination) {... }

Metadane W standardzie J5SE jest od razu zdefiniowane 7 annotacji. java.lang Override Deprecated supresswarnings java.lang.annotations meta-annotacje Documented Inherited Target Retention

Annotacje z java.lang Rozumiane przez kompilator javac (no.. prawie). Deprecated Znaczenie jak javadoc @deprecated Może zostać sprawdzone w działającym programie SupressWarnings Oznacza, jakie uwagi kompilatora mają być pomijane Dobre do zaznaczenia, że programista wie, co robi W tej chwili nie jest wspierane przez javac

Annotacje - Override Służy do oznaczenia, że dana metoda ma przesłaniać metodę z klasy wyżej Jeżeli warunek nie zostanie spełniony kompilator zgłosi błąd Cenne do kontrolowania, czy na pewno przesłania się metodę zamiast tworzyć nową Widzi się brakujące metody w nadklasach

Meta-annotacje Documented Wskazuje, że element powinien być udokumentoway (np. przy użyciu javadoc) Inherited Wskazuje, że dana annotacja ma być dziedziczona pomiędzy klasami Działa tylko na klasach Nie interfejsy Nie przesłonięte metody

Meta-annotacje Target Mówi, na jakich elementach dana annotacja może być użyta Standardowo jest dostępna dla wszystkich elementów

Meta-annotacje Retention Określa poziom, z jakiego widać annotacje SOURCE usuwane przy kompilacji CLASS zachowywane przez kompilator w pliku class, ale nie muszą być wyciągane przez VM RUNTIME zachowywane w pliku class i widoczne z poziomu VM Domyślnie jest CLASS

Używanie annotacji Mało przydatne, jeżeli nie można do nich sięgnąć. Kiedy można użyć annotacji? Tworzenie kodu Budowa programu Testy Działająca aplikacja

Annotacje gdzie i jak stosowane Tworzenie Do oznaczenia stosowanych rozwiązań Budowa Kompilator rozpoznaje annotacje z java.lang Wiedza o annotacjach z poziomu SOURCE Użycie apt Tworzenie dodatkowych plików na podstawie istniejących

Annotacje gdzie i jak stosowane Działająca aplikacja Możliwe zastosowanie do aspetków Dynamiczne tworzenie klas, np. BeanInfo w momencie wczytania Bean Środowisko może szukać annotacji

Dojście do annotacji poprzez Reflection W działającym programie można zobaczyć tylko annotacje z poziomu RUNTIME Poprzez zastosowanie pakietów java.lang.reflect.* (Method, Constructor, Package ) można dotrzeć do annotacji dla wybranych elementów i odpowiednio zareagować.

Annotacje - przykład import java.lang.annotation.*; public @interface Test { } public class Foo { @Test public static void m1() { } public static void m2() { } @Test public static void m3() { throw new RuntimeException("Boom"); } public static void m4() { } }

Bardzo proste zastosowanie Reflection import java.lang.reflect.*; public class RunTests { public static void main(string[] args) throws Exception { int passed = 0, failed = 0; for (Method m : Class.forName(args[0]).getMethods()) { if (m.isannotationpresent(test.class)) { try { m.invoke(null); passed++; } catch (Throwable ex) { System.out.printf("Test %s failed: %s %n", m, ex.getcause()); failed++; } } } System.out.printf("Passed: %d, Failed %d%n", passed, failed); } }

Działanie z annotacjami przy budowie programu - APT Annotation Processing Tool Narzędzie JDK przeznaczone do operowania z annotacjami Wspiera rekurencyjne wywoływanie dla tworzonych plików

Apt żeby zadziałał Trzeba napisać AnnotationProcessorFactory On będzie tworzył AnnotationProcessor odpowiedni dla zadanej annotacji Dodać tools.jar do classpath dla atp Wywołać apt składnia bardzo podobna do javac, dodane opcje specjalne dla apt. Automatycznie skompiluje kod wygenerowany przez AnnotationProcessor

com.sun.mirror Dostęp do APT poprzez paczki z com.sun.mirror com.sun.mirror.apt interfejs do apt com.sun.mirror.declarations elementy odpowiadające deklaracjom w kodzie (metody, pola, klasy ) com.sun.mirror.types typy w kodzie, wywołania elementów z deklaracji com.sun.mirror.util narzędzia do pracy na deklaracjach i typacj

AnnotationProcessorFactory public Collection<String> supportedannotationtypes() Zwraca kolekcję annotacji, jakie potrafi obsłużyć dana fabryka Możliwe wartości: *, foo.* foo.bar public Collection<String> supportedoptions() Określa, jakie opcje z poziomu wywołania apt są dostępne public AnnotationProcessor getprocessorfor( Set<AnnotationTypeDeclaration> types, AnnotationProcessorEnvironment env ) zwraca processor dla zadanych annotacji oraz podanego środowiska

AnnotationProcessor public void process() Zrobić wszystko co potrzeba bezpośrednio w tej metodzie Skorzystamy z mechanizmu Visitors z com.sun.mirror.util.*

Annotacje kontra Interfejsy W specyficznych sytuacjach można zastąpić Interface przez odpowiednią annotację Interface wskazuje żądane zdolności Część języka Annotacja mówi o żądanych atrybutach Mechanizm do osobnych narzędzi

Annotacja czy interface bez metod Czasami można skorzystać z annotacji serializable czy @serializable Określa tylko pewną zdolność, bez metod Ale: jak z annotacją wyrazić void savetofile (Serializable object) bean czy @bean Interfejs nic tu nie dodaje, jedynie pokazuje podążanie pewnym wzorcem Annotacja mogłaby być pomocna: Automatyczne generowanie BeanInfo

Annotacje ograniczenia Brak dziedziczenia @interface FixMe extends ToDo { } Meta-annotacja + apt? @target({annotation_type}) @interface extends { String value() } @extends( ToDo ) @interface FixMe { }

Annotacje - braki Więcej standardowych annotacji Apt zintegrowany z javac Paczki apt i mirror w com.sun.*, dlaczego nie java.*?

Annotacje - podsumowanie Własne modyfikatory Nie zmieniają semantyki programu Ale narzedzia z ich pomocą mogą to zrobić Raczej wyszukać i stosować standardowe annotacje niż pisać własne Gotowe narzędzia - apt

Podsumowanie Najbardziej znaczące w wydaniu wydają się typy generyczne oraz mechanizm annotacji Wprowadzenie konstrukcji skracających kod oraz poprawiających czytelność Największe rozszerzenie języka do tej pory.

Linki http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-tiger3.html http://java.sun.com/j2se/1.5.0/docs/guide/apt/index.html http://www.softwaresummit.com/2004/speakers/landersannotations.pdf http://www.softwaresummit.com/2004/speakers/landersgenerics.pdf

Koniec jb209233@students.mimuw.edu.pl