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



Podobne dokumenty
TYPY GENERYCZNE (GENERICS)

Programowanie obiektowe

Programowanie w języku Java

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe

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

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

Dawid Gierszewski Adam Hanasko

Typy sparametryzowane

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

import java.util.*; public class ListExample { public static void main(string args[]) { List<String> lista1= new ArrayList<String> ();

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

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Podstawy otwartych języków programowania Przechowywanie danych

Klasy abstrakcyjne, interfejsy i polimorfizm

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

Platformy Programistyczne Podstawy języka Java

Programowanie obiektowe

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

Kurs programowania. Wykład 9. Wojciech Macyna

java.util.* :Kolekcje Tomasz Borzyszkowski

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

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

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Polimorfizm. dr Jarosław Skaruz

Programowanie wieloplatformowe w Java

Metody sparametryzowane

Realizacja ekstensji klasy. Paulina Strzelecka, Tomasz Roszkowski

Generatory. Michał R. Przybyłek

Wykład 7: Pakiety i Interfejsy

Programowanie w języku Java WYKŁAD

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

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

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

SZKOLENIE. Programowanie w języku Java. tel.: ; fax: ,

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

Java Platform Micro Edition

WPROWADZENIE DO JĘZYKA JAVA

Java niezbędnik programisty spotkanie nr 8. Kolekcje c.d.

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

Wstęp do ruby dla programistów javy

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Programowanie obiektowe

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

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

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Szablony. Szablony funkcji

Programowanie w języku Java. Kolekcje

Programowanie w Javie wykład 8 Interfejsy

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

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

Dokumentacja do API Javy.

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

Programowanie obiektowe

Tworzenie aplikacji w języku Java

Programowanie obiektowe w języku

Dziedziczenie. dr Jarosław Skaruz

Co jeszcze mogą nam dać adnotacje? Adam Warski


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

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

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

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

Java: interfejsy i klasy wewnętrzne

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Programowanie w Internecie. Java

Programowanie obiektowe

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Zaawansowane aplikacje WWW - laboratorium

Programowanie urządzeń mobilnych

Programowanie obiektowe

Kolekcje mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

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

Języki i metody programowania Java INF302W. Wykład 1 (część 1) na podstawie Autor Dr inż. Zofia Kruczkiewicz

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

Programowanie i projektowanie obiektowe

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Aplikacje w środowisku Java

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

Podstawy otwartych języków programowania Język Java

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

Programowanie obiektowe zastosowanie języka Java SE

Programowanie obiektowe

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusz Mikoda

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

JAX-RS czyli REST w Javie. Adam Kędziora

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

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

Programowanie obiektowe

Programowanie obiektowe

Tworzenie aplikacji w języku Java

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

Wywoływanie metod zdalnych

Transkrypt:

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

Historia 1991 rozpoczyna się the Green Project (to jeszcze era MS DOS) 1992 pojawia się język Oak 1995 zmiana nazwy z Oak na Java 1996 JDK 1.0 1997 JDK 1.1 (JavaOne, z blisko 8000 uczestnikami, staje się największą konferencją programistyczną na świecie) 4 grudzień 1998 JDK promowane pod nazwą nazwą Java 2 Platform, Standard Edition; język w wersji 1.2; duże zmiany w API (mechanizm odzwierciedleń, Swing) 8 Maj 2000 J2SE 1.3 (HotSpot) 13 luty 2002 J2SE 1.4 (asercje, wyrażenia regularne, podczepianie wyjątków, zintegorwany parser XML i procesor XSLT) 29 wrzesień 2004 J2SE 5 (kolejna zmiana nazwy, Tiger); (typy generyczne, anotacje, typy wyliczeniowe, rozszerzone for,...) 2

Plany Kolejne wydania mają się ukazywać co 18-24 miesiące, są opracowywane jako Java Specification Request (JSR) w ramach JCP i mają integrować wyniki pozostałych JSR: Lato 2006 Java, Standard Edition 6 (już nie J2SE) inaczej Mustang; Ujednolicone nazewnictwo obejmie również: Java, Enterprise Edition 5 Java, Micro Edition (nie ma numerka) (trzeba się odzwyczajać od J2EE, J2ME) 3

Źródła http://en.wikipedia.org/wiki/java_programming_language http://www.java.com/en/about/brand/naming.jsp http://www.java.com/en/javahistory/timeline.jsp https://mustang.dev.java.net/ http://jcp.org/en/jsr/all http://java.sun.com/developer/onlinetraining/new2java/programming/learn/unravelingjava.html 4

Przedefiniowywanie typu zwrotnego class Owoc { class Gruszka extends Owoc { class DrzewoOwocowe { Owoc wydajplon() { return new Owoc(); class Wierzba extends DrzewoOwocowe { //przed Javą 5.0 Gruszki nie mogły rosnąć na Wierzbie Owoc wydajplon() { return new Gruszka(); //kontrola typów dopiero w chwili wykonania Gruszka gru = (Gruszka) wierzba.wydajplon(); 5

Przedefiniowywanie typu zwrotnego class Owoc { class Śliwka extends Owoc { class DrzewoOwocowe { Owoc wydajplon() { return new Owoc(); class Sosna extends DrzewoOwocowe { //przykład Śliwek na Sośnie w Javie 5.0 Śliwka wydajplon() { return new Śliwka(); //kontrola typów podczas kompilacji Śliwka śli = sosna.wydajplon(); 6

Kolejki FIFO Queue q = new LinkedList(); //FIFO q.offer("b"); q.add("a");//zapełnienie skutkuje "niepilnowanym" wyjątkiem //wart. zwrotna informuje, czy kolekcja się zmieniła q.offer("c");//zapełnienie to niekoniecznie sytuacja nietypowa //offer() rozróżnia po wartości zwrotnej System.out.print(q.poll());//kolejny element lub null System.out.print(q.remove());//zgłasza "niepilnowany" //ale może zgłosić "niepilnowany" NoSuchElementException System.out.print(q.peek());//podglądamy, ale nie zdejmujemy System.out.print(q.element());//jak peek //ale może zgłosić "niepilnowany" NoSuchElementException System.out.print(q.poll()); Wynik: baccc 7

Klejki priorytetowe PriorityQueue q = new PriorityQueue(12, //domyślny pocz. rozmiar=11 new Comparator() { public int compare(object ii, Object jj) { int i = (Integer) ii;//automatyczne odpakowywanie int j = (Integer) jj;//automatyczne odpakowywanie int wynik = i%2 - j%2;//parzyste < nieparzyste if (wynik == 0) wynik = i-j; return wynik; ); for (int i = 1; i <= 12; i++) q.offer(i);//auto. opakowywanie for (int i = 1; i <= 12; i++) System.out.print(q.poll()+, ); Wynik: 2, 4, 6, 8, 10, 12, 1, 3, 5, 7, 9, 11, 8

Iterowanie po kolejce priorytetowej Iterator jedynie podgląda elementy i nie gwarantuje żadnego porządku. for (int i = 1; i <= 12; i++) q.offer(i);//auto. opakowywanie for (Iterator iter = q.iterator(); iter.hasnext();) { //kontrola typów dopiero w chwili wykonania int el = (Integer) iter.next(); el += 10; System.out.println(el++, ); Przykładowy wynik: 12, 14, 16, 18, 20, 22, 17, 11, 19, 15, 21, 13, 9

Nowy rodzaj pętli for Dla kolekcji i tablic dodano nowy rodzaj pętli for zintegrowanej z iteratorem. for (Object i : q) { int el = (Integer) i; System.out.print(el+10); System.out.print("-"); System.out.print(((Integer) i) + 10);//auto. odpakowywanie System.out.print(", "); Przykładowy wynik: 12-12, 14-14, 16-16, 18-18, 20-20, 22-22, 17-17, 11-11, 19-19, 15-15, 21-21, 13-13, 10

Nowy rodzaj pętli for Jeżeli bardzo nam zależy na użyciu iteratora można sobie poradzić przy pomocy klasy Arrays. Object[] tab = q.toarray(); Arrays.sort(tab, new MójComparator()); for (Object i : tab) { int el = (Integer) i; System.out.print(el+10); System.out.print(", "); Wynik: 12, 14, 16, 18, 20, 22, 11, 13, 15, 17, 19, 21, 11

Typy generyczne Najważniejszym udogodnieniem w Javie 5.0 są typy generyczne. class ComparatorNaInteger implements Comparator<Integer> { public int compare(integer i, Integer j) { int wynik = i%2 - j%2; if (wynik == 0) wynik = i-j; return wynik; Od Javy 5.0 zmieniły się definicje wielu podstawowych klas, np. Interface Comparator<T> int compare(t o1, T o2) 12

Typy generyczne PriorityQueue<Integer> q = new PriorityQueue<Integer>(12, new ComparatorNaInteger()); for (int i = 1; i <= 12; i++) q.offer(i); for (int i = 1; i <= 12; i++) { int el = q.poll()+10;//poll() zwraca Integery, a nie Objecty System.out.print(el+", "); 13

Typy generyczne PriorityQueue<Integer> q = new PriorityQueue<Integer>(12, new ComparatorNaInteger()); //można podać zwykły Comparator, ale pojawią się ostrzeżenia for (int i = 1; i <= 12; i++) q.offer(i);//auto. opakowywanie for (Integer el : q) {//niestety losowa kolejność System.out.print(el+10); System.out.print(", "); 14

Nie trzeba już tyle rzutować //jako klucza mapy często używa się liczb lub napisów Map<Integer, Integer> kwadraty = new HashMap<Integer, Integer>(); for (int i = 0; i < 100; i++) kwadraty.put(i, i*i); for (int i = 0; i < 8; i++) { int n = i * 13; System.out.println(n+" do kwadratu to "+kwadraty.get(n)); //teraz jest też łatwiej dobrać się do dziwnych wartości Map<String, List<List<int[]>>> mapa = getmymap(); int x = map.get(klucz).get(0).get(0)[0]; 15

A co z jawnymi iteratorami? List<String> napisy = new LinkedList<String>(); napisy.add("trele"); napisy.add("morele"); for (Iterator<String> i = napisy.iterator(); i.hasnext(); ) { String s = i.next(); System.out.println(s); //nieparametryzowany iterator działa po staremu (trzeba rzutować) for (Iterator i = napisy.iterator(); i.hasnext(); ) { String s = (String) i.next(); System.out.println(s); 16

Bezpieczny iterator do niebezpiecznej kolekcji Opracował List napisy = new LinkedList(); napisy.add("fiu"); napisy.add("bździu"); //napisy.add(1); for (Iterator<String> i = napisy.iterator(); i.hasnext(); ) { String s = i.next();//ew. błąd dopiero w czasie wykonania System.out.println(s); Sparametryzowane typy można też przekazywać jako parametry lub wynik metody. Tak samo jak powyżej można też oszukiwać. Kompilator wspomaga nas ostrzeżeniami. 17

A co z hierarchią typów? Jest oparta na typach bazowych, a nie na parametrach! LinkedList<Number> numerki = new LinkedList<Number>(); List<Number> jeszczewięcejnumerków = numerki; //numerki = new LinkedList<Float>(); //LinkedList<Object> obiekty = numerki; //oto potencjalne zagrożenia //obiekty.add("pseudo numerek"); 18

Erasure Typy generyczne są brane pod uwagę jedynie w chwili kompilacji. List<String> napisy = new LinkedList<String>(); W trakcie działania programu są wymazywane (ang. erase). List napisy = new LinkedList(); To kolejny powód dlaczego parametry nie są brane pod uwagę przy dziedziczeniu. Z tego powodu typy generyczne dają się oszukiwać (jedyną wskazówką będą ostrzeżenia) List<Integer> ints = new LinkedList<Integer>(); List staralista = ints;//działa ze względu na wsteczną kompatyb. staralista.add("klops");//tu nie ma żadnych problemów Integer i = ints.get(0);//za to będą w chwili wykonania 19

Oszukiwać można też przy pomocy RTTI Opracował class Oszustwo { public static List<Integer> ints = new ArrayList<Integer>(); static void wypisz() { for (Integer i : ints) System.out.println(i); static void test() { ints.add(1); ints.add(2); ints.add(3); try { List list = (List) Oszustwo.class.getDeclaredField("ints").get(null); list.add("niezły numerek");//tu nadal będzie ostrzeżenie catch (Exception e) { e.printstacktrace(); wypisz(); 20

Jak pozbyć się ostrzeżeń? Lepsza jednak taka ochrona typów niż żadna. Trzeba dołożyć wszelkich starań, żeby gotowe programy nie generowały żadnych ostrzeżeń. ostrzeżenia powstają przy przekazywaniu parametrów, a przy pobieraniu wyników nie: static void test2(list list) { for (Iterator i = list.iterator(); i.hasnext(); ) System.out.println(i.next().toString()); Jeżeli potrzebne są kolekcje ogólne, to parametryzujemy typem Object, np. List<Object> (zazwyczaj słaby pomysł ze względu na hierarchię typów) lub używamy? (niestety dostajemy typy read-only): static void test3(list<?> list) { //list.add((object) "napis"); for (Iterator<?> i = list.iterator(); i.hasnext(); ) System.out.println(i.next().toString()); 21

Parametryzowanie własnych typów class Śmietnik<T> { protected List<T> zawartość; public Śmietnik() { zawartość = new ArrayList<T>(); public boolean czypusty() { return zawartość.size() == 0; public int rozmiar() { return zawartość.size(); public void wyrzuć(t o) { zawartość.add(o); public T wygrzeb() { if (!czypusty()) return zawartość.remove(0); else return null; Śmietnik<String> napisy = new Śmietnik<String>(); 22

Uwaga na atrybuty statyczne Parametryzujemy egzemplarze (Śmietnik<Byte>, Śmietnik<Float>,...), a nie klasę więc nie można nic zakładać o składowych statycznych //private static List<T> listastat = new ArrayList<T>(); //static T weźsmiecia(śmietnik<t> r) { return r.wygrzeb(); Oczywiście typy o określonym parametrze działają: static public int max(śmietnik<byte> b, Śmietnik<Float> f) { return Math.max(b.rozmiar(), f.rozmiar()); Można też wskazać parametry dla metody statycznej public static <T, U> int max2(śmietnik<t> t, Śmietnik<U> u) { return Math.max(t.rozmiar(), u.rozmiar()); 23

Parametry można ograniczać class ŚmietnikMatematyka<N extends Number> extends Śmietnik<N> { public ŚmietnikMatematyka() { super(); public double suma() { double suma = 0; for (N n : zawartość) suma += n.doublevalue(); return suma; 24

Podobnie z parametrami metod public static double suma(śmietnik<? extends Number> śm) { double suma = 0; for (Number n : śm.zawartość) suma += n.doublevalue(); return suma; public static <T extends Number> double suma(śmietnik<t> t1, Śmietnik<T> t2) { double suma = 0; for (Number n : t1.zawartość) suma += n.doublevalue(); for (Number n : t2.zawartość) suma += n.doublevalue(); return 0; 25

Zagadka class NieudanyComparatorNaInteger<Integer> implements Comparator<Integer> { public int compare(integer i, Integer j) { int wynik = i%2 - j%2; if (wynik == 0) wynik = i-j; return wynik; 26