1 / 41

Новости в JDK 1.5

Новости в JDK 1.5. Светлин Наков. www.devbg.org. Съдържание. Принципи при дизайна на JDK 1.5 Нововъведения в езика Java Автоматично опаковане и разопаковане ( boxing и unboxing) Разширен синтаксис на for - циклите Изброени типове ( enumerations) Статично включване ( static import)

nida
Download Presentation

Новости в JDK 1.5

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Новости в JDK 1.5 Светлин Наков www.devbg.org

  2. Съдържание • Принципи при дизайна на JDK 1.5 • Нововъведения в езика Java • Автоматично опаковане и разопаковане (boxing и unboxing) • Разширен синтаксис на for-циклите • Изброени типове (enumerations) • Статично включване (static import) • Методи с променлив брой аргументи • Ковариантност на връщания тип • Шаблонни типове (generics) • Метаданни в кода (annotations)

  3. Съдържание • Разширения на стандартните библиотеки • Класът StringBuilder • Класовете Formatter и Scanner • Нови контейнер-класове: Queue, Stack, PriorityQueue, ConcurentQueue • Новo API за конкурентно програмиране • Динамични стъбове за RMI • Новости в JDBC – New Row Sets • Monitoring & Manageability API (JMX) • Новости в XML библиотеките • Подобрения във виртуалната машина

  4. История на езика Java • 1995 (1.0) – Java се появява за първи път • 1997 (1.1) – Добавени са вложени класове • 2001 (1.4) – Добавени са assertions • 2004 (1.5) – Значителни промени в синтаксиса на езика – enums, generics, annotations, … • Излиза официално в края на август 2004 • Рекламира се още като Java 5Platform • P.S. Ако някой твърди, че има 10 години опит с Java, не му вярвайте!

  5. Принципи, залегнали в JDK 1.5 • Улесняване на разработчика • Спестяване писането на досаден код • Подобряване производителността • Максимална съвместимост с предходните версии

  6. Auto boxing/unboxing • Автоматичното опаковане и разопаковане (boxing/unboxing) на примитивните типове спестява писане на досаден код • Boxing = примитивен  wrapper class, например int Integer • Unboxing = wrapper class примитивен, например Long  long ArrayList list = new ArrayList(); list.add(5); // auto boxing: int --> Integer Integer i = (Integer) list.get(0); int i2 = i; // auto unboxing: Integer --> int

  7. Разширение на for-циклите • Стандартният оператор за for-цикъл има разширен синтаксис за обхождане на колекции и масиви: Person[] persons = new Person[] { new Person("Бай Иван"), new Person("Цар Киро"), new Person("Баба Яга") }; for (Person p : persons) { System.out.println(p); }

  8. Разширение на for-циклите • При обхождане на колекции все още трябва да се преобразуват типовете: • По-нататък ще видим как този проблем се решава чрез шаблони (generics) ArrayList personsList = new ArrayList(); personsList.add(new Person("Бай Иван")); personsList.add(new Person("Цар Киро")); personsList.add(new Person("Баба Яга")); for (Object obj : personsList) { Person person = (Person) obj; System.out.println(person); }

  9. Изброени типове (enums) • Изброени типове (enums) в JDK 1.5 • силно типизирани • приемат стойности само измежду предварително дефинирано множество • компилират се до класове, наследници на java.lang.Enum • сериализируеми public enum Color { WHITE, RED, GREEN, BLUE, BLACK }

  10. Изброени типове (enums) • Позволени са операторите ifи switch: switch (color) { case WHITE: System.out.println("бяло"); break; case RED: System.out.println("червено"); break; ... } if (color == Color.RED) { ... }

  11. Изброени типове (enums) • Дефинирани са стандартни методи ordinal()иvalues(): public static void main(String[] args) { Color color = Color.RED; System.out.println("color = " + color); int value = color.ordinal(); System.out.println("value = " + value); for(Color c : Color.values()) { System.out.println("Color." + c + " = " + c.ordinal()); } }

  12. Статично включване • Статичното включване на клас (static import) позволява директно използване на неговите членове: import static java.lang.Math.*; public static void main(String[] args) { // Пишем директно PI, а не Math.PI // и sin(PI/2), а не Math.sin(Math.PI/2) System.out.println( "PI = " + PI + ", sin(PI/2) = " + sin(PI/2) ); }

  13. Променлив брой аргументи • Вече можем да дефинираме методи с променлив брой аргументи: double average(double ... aValues) { double sum = 0; for (double value : aValues) { sum = sum + value; } double avg = sum / aValues.length; return avg; } System.out.println(average(5,6)); System.out.println(average(1,2,3,4,5));

  14. Ковариантност на връщания тип • При имплементация на интерфейси методите могат да връщат вместо типа, обявен в интерфейса, негов наследник: interface SomeInterface { public Object someMethod(); } public class Cimplements SomeInterface{ public String someMethod() { return "I return String " + "instead of Object"; } }

  15. Шаблонни типове • Шаблонните типове (generics) служат за дефиниране на параметризирани класове • Параметрите се дефинират се с ъглови скоби, като в C++. Например: public class Example<T> { private T mValue; public Example<T>(T aValue) { mValue = aValue; } public T getValue() { return mValue; } }

  16. Шаблонни типове • При деклариране на променлива от шаблонен тип се задават параметрите: • Допуска се инстанциране само по клас (не може по примитивен тип) • ДекларациятаExample<int> е невалидна Example<String> str = new Example<String>( "Шаблони, маблони, макарони и купони"); System.out.println(str.getValue()); Example<Double> d = new Example<Double>(3.14159265); System.out.println(d.getValue());

  17. Шаблонни типове • Каква е ползата от шаблонните типове? • Подобряване на четимостта на кода • Осигуряване на типова безопасност • Къде се използват? • Най-вече колекции – Vector, ArrayList, Hashtable, HashMap, … • Как са реализирани? • На ниво компилатор е добавена проверка за съответствието на типовете • Параметрите се представят вътрешно като Objectи не съществуват по време на изпълнение

  18. Шаблонни колекции • Всички стандартни колекции в JDK 1.5 вече са шаблонни: import java.util.*; ArrayList<Integer> list = new ArrayList<Integer>(); list.add(5); int value = list.get(0); HashMap<String, Integer> ageMap = new HashMap<String, Integer>(); ageMap.put("Бай Киро", 83); int kiroAge = ageMap.get("Бай Киро");

  19. Шаблонни колекции • Шаблонните колекции могат да се обхождат директно с новия синтаксис за for-цикъл: ArrayList<Person> personsList = new ArrayList<Person>(); personsList.add(new Person("Бай Иван")); personsList.add(new Person("Цар Киро")); personsList.add(new Person("Баба Яга")); for (Personperson : personsList) { System.out.println(person); }

  20. Шаблонни типове • Възможно е ограничаване на типа на параметрите на шаблонен клас: class Example<T extends Person> { ... } class Example2<T extends Shape & Movable, Transformable> { ... } void fill(List<? extends Shape> aList) { ... }

  21. Шаблонни методи • Методите също могат да бъдат шаблонни, независимо от класовете: static <T> void swap(T[] arr, int index1, int index2) { T temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; } public static void main(String[] args) { Integer[] intArray = {10, 20, 30, 40}; swap(intArray, 1, 3); }

  22. Демонстрация Използване на шаблонни типове (generics)

  23. Анотации • Анотациите позволяват прикрепяне на метаданни към декларациите в кода (класове, методи, член-променливи, ...) • Много приличат на атрибутите в .NET • Задават се с @SomeAnnotation • Не променят семантиката на програмата • Обработват се от инструменти, които ги разпознават • Могат да приемат параметри • Могат да се дефинират от програмиста

  24. Анотации • Декларация на интерфейс за анотации: @Retention(RetentionPolicy.RUNTIME) @interface Author { String name(); } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface Optimize { String level() default "release"; boolean threadSafe(); String lastCheckDate(); // java.util.Date not allowed! }

  25. Анотации • Използване на анотации в кода: @Author(name="Svetlin Nakov") public class AnnotDemo { @Optimize(level="debug", threadSafe=false, lastCheckDate="20.07.2004") public void test() { ... } }

  26. Анотации • Анотациите са наследници на java.lang.anotation.Anotation • Могат да се извличат чрез reflection: import java.lang.annotation.*; Annotation classAnnot = AnnotDemo.class. getAnnotation(Author.class); System.out.println("AnnotDemo class " + "has annotation: " + classAnnot); Author classAuthor = (Author) classAnnot; System.out.println("AnnotDemo has " + "author: " + classAuthor.name());

  27. Анотации • Анотациите постепенно ще заместват външните XML конфигурационни файлове, масово използвани в J2EE // EJB 3.0 session bean @Session public class SampleSessionBean { private DataSource customerDB; @Inject private void setCustomerDB( DataSource customerDB){ this.customerDB = customerDB; } ... }

  28. Демонстрация Използване на анотации

  29. Нови класовев JDK 1.5 • Разширения на стандартните библиотеки • Клас java.lang.StringBuilder – като StringBuffer, но не е синхронизиран (и съответно е по-бърз) • Клас java.util.Formatter – за форматиране, подобно на sprintf() в C • Клас java.util.Scanner – за форматиран вход от потоци и файлове • Класът java.io.PrintStream има метод printf() за форматиран изход • Нови колекции в java.util – Queue, Stack, PriorityQueue

  30. Форматиран вход/изход Date now = new java.util.Date(); System.out.printf("Today is " + "%1$te.%1$tm.%1$tY", now); String name = "Svetlin Nakov"; int count = 15; System.out.printf("Welcome, %1$s. You " + "are visitior %2$d.\n",name, count); Scanner sc = new Scanner(System.in); int value = sc.nextInt(); System.out.printf("value = %1$d", value);

  31. Конкурентно програмиране • Новото API за конкурентно програмиране (java.util.concurrent) предоставя: • Executors, Thread pools, Callables • BlockingQueue, ConcurrentHashMap • Locks – (ReentrantLock, ReadWriteLock) – lock(), unlock(), tryLock() • Conditions – await(), signal() • Атомарни променливи – AtomicBoolean, AtomicInteger, AtomicReference – incrementAndGet(), getAndSet(…), compareAndSet(…)

  32. Executors • Изпълнителите (executors) са обекти, които изпълняват задачи • Могат да стартират задачите синхронно или асинхронно: • в текущата нишка (thread) • в отделни нишки (threads) • в thread pools • ограничени или неограничени • последователно една след друга • на определено време

  33. Executors • Класът java.util.concurrent.Executorsима методи за създаване на различни изпълнители (executors) • newSingleThreadExecutor() – опашка със задачи – изпълняват се една по една по реда на постъпване • newFixedThreadPool(int x) – thread pool с xработни нишки – изпълнява по xзадачи едновременно • newCachedThreadPool() – класически thread pool – изпълнява всички задачи едновременнои ползва thread reuse

  34. Executors – пример // Create a thread pool with 3 worker threads int threadsCount = 3; ExecutorService pool = Executors. newFixedThreadPool(threadsCount); // Add some tasks to the pool int tasksCount = 12; for (int i = 0; i < tasksCount; i++) { pool.execute(new Task("t" + (i+1))); } // Destroy the pool after all tasks get finished pool.shutdown();

  35. Демонстрация Използване на thread pools

  36. Други новости в JDK 1.5 • Подобрения в RMI • Динамично генериране на stub класове по време на изпълнение • Нови row sets в JDBC • JdbcRowSet, FilteredRowSet, JoinRowSet, CachedRowSet (disconnected row set), WebRowSet(XML based) • Monitoring & Manageability API • Средства за наблюдение на виртуалната машина (памет, ресурси, натоварване, ...) • JMX (Java Management Extensions) в JVM

  37. Проследяване на стека // Show current thread's stack trace java.lang.StackTraceElement ste[] = Thread.currentThread().getStackTrace(); for (int i=0; i < ste.length; i++) { System.out.println(ste[i]); } // Show all threads' stack traces Map<Thread,StackTraceElement[]> allStacks = Thread.getAllStackTraces(); System.out.println(allStacks);

  38. Още новости в JDK 1.5 • Новости в XML библиотеките • XML 1.1, SAX 2, DOM 3, XSLT • Non-blocking версия на класовете SSLSocketи SSLServerSocket • Подобрения във виртуалната машина • Class Data Sharing • JVM използва memory-mapped файлове, за да ускори зареждането на големи JAR архиви • Общите JAR файлове се зареждат в обща за различните инстанции на JVM памет

  39. Още новости в JDK 1.5 • Подобрения в Desktop GUI библиотеките • Подобрения в скоростта • Java2D може да ползва OpenGL • XAWT – Олекотена AWT библиотека за X11 терминали • Нови look-and-feel схеми

  40. За повече информация • За download на JDK 1.5 beta 2: • http://java.sun.com/j2se/1.5.0/download.jsp • Технически преглед: • http://java.sun.com/developer/technicalArticles/releases/j2se15/ • New Features of J2SE 1.5 (Tiger): • http://www.javacommunity.org/conference/5th/data/2_1.pdf • Java JDK 1.5: • http://www.tyma.com/tymajdk15.pdf

  41. Новости в JDK 1.5 Въпроси?

More Related