JDK 1.5 New Features

2,506 views

Published on

Принципи при дизайна на JDK 1.5.
Нововъведения в езика Java.
Автоматично опаковане и разопаковане (boxing и unboxing).
Разширен синтаксис на for-циклите.
Изброени типове (enumerations).
Статично включване (static import).
Методи с променлив брой аргументи.
Ковариантност на връщания тип.
Шаблонни типове (generics).
Метаданни в кода (annotations).
Разширения на стандартните библиотеки.
Класът StringBuilder.
Класовете Formatter и Scanner.
Нови контейнер-класове: Queue, Stack, PriorityQueue, ConcurentQueue.
Новo API за конкурентно програмиране.
Динамични стъбове за RMI.
Новости в JDBC – New Row Sets.
Monitoring & Manageability API (JMX).
Новости в XML библиотеките.
Подобрения във виртуалната машина.

Published in: Education, Business, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,506
On SlideShare
0
From Embeds
0
Number of Embeds
37
Actions
Shares
0
Downloads
61
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

JDK 1.5 New Features

  1. 1. Новости в JDK 1.5 Светлин Наков www.devbg.org
  2. 2. Съдържание <ul><li>Принципи при дизайна на JDK 1.5 </li></ul><ul><li>Нововъведения в езика Java </li></ul><ul><ul><li>Автоматично опаковане и разопаковане ( boxing и unboxing) </li></ul></ul><ul><ul><li>Разширен синтаксис на for - циклите </li></ul></ul><ul><ul><li>Изброени типове ( enumerations) </li></ul></ul><ul><ul><li>Статично включване ( static import) </li></ul></ul><ul><ul><li>Методи с променлив брой аргументи </li></ul></ul><ul><ul><li>Ковариантност на връщания тип </li></ul></ul><ul><ul><li>Шаблонни типове ( generics) </li></ul></ul><ul><ul><li>Метаданни в кода ( annotations) </li></ul></ul>
  3. 3. Съдържание <ul><li>Разширения на стандартните библиотеки </li></ul><ul><ul><li>Класът StringBuilder </li></ul></ul><ul><ul><li>Класовете Formatter и Scanner </li></ul></ul><ul><ul><li>Нови контейнер-класове: Queue , Stack , PriorityQueue , ConcurentQueue </li></ul></ul><ul><ul><li>Нов o API за конкурентно програмиране </li></ul></ul><ul><ul><li>Динамични стъбове за RMI </li></ul></ul><ul><ul><li>Новости в JDBC – New Row Sets </li></ul></ul><ul><ul><li>Monitoring & Manageability API (JMX) </li></ul></ul><ul><ul><li>Новости в XML библиотеките </li></ul></ul><ul><li>Подобрения във виртуалната машина </li></ul>
  4. 4. История на езика Java <ul><li>1995 (1.0) – Java се появява за първи път </li></ul><ul><li>1997 (1.1) – Добавени са вложени класове </li></ul><ul><li>2001 (1.4) – Добавени са assertions </li></ul><ul><li>2004 (1.5) – Значителни промени в синтаксиса на езика – enums, generics, annotations, … </li></ul><ul><ul><li>Излиза официално в края на август 2004 </li></ul></ul><ul><ul><li>Рекламира се още като Java 5 Platform </li></ul></ul><ul><li>P.S. Ако някой твърди, че има 10 години опит с Java, не му вярвайте! </li></ul>
  5. 5. Принципи, залегнали в JDK 1.5 <ul><li>Улесняване на разработчика </li></ul><ul><li>Спестяване писането на досаден код </li></ul><ul><li>Подобряване производителността </li></ul><ul><li>Максимална съвместимост с предходните версии </li></ul>
  6. 6. Auto boxing/unboxing <ul><li>Автоматичното опаковане и разопаковане (boxing/unboxing) на примитивните типове спестява писане на досаден код </li></ul><ul><li>Boxing = примитивен  wrapper class, например int  Integer </li></ul><ul><li>Unboxing = wrapper class  примитивен , например Long  long </li></ul>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. 7. Разширение на for - циклите <ul><li>Стандартният оператор за for - цикъл има разширен синтаксис за обхождане на колекции и масиви: </li></ul>Person[] persons = new Person[] { new Person(&quot;Бай Иван&quot;), new Person(&quot;Цар Киро&quot;), new Person(&quot;Баба Яга&quot;) }; for (Person p : persons) { System.out.println(p); }
  8. 8. Разширение на for - циклите <ul><li>При обхождане на колекции все още трябва да се преобразуват типовете: </li></ul><ul><li>По-нататък ще видим как този проблем се решава чрез шаблони ( generics ) </li></ul>ArrayList personsList = new ArrayList(); personsList.add(new Person(&quot;Бай Иван&quot;)); personsList.add(new Person(&quot;Цар Киро&quot;)); personsList.add(new Person(&quot;Баба Яга&quot;)); for (Object obj : personsList) { Person person = (Person) obj; System.out.println(person); }
  9. 9. Изброени типове (enums) <ul><li>Изброени типове (enums ) в JDK 1.5 </li></ul><ul><ul><li>силно типизирани </li></ul></ul><ul><ul><li>приемат стойности само измежду предварително дефинирано множество </li></ul></ul><ul><ul><li>компилират се до класове, наследници на java.lang.Enum </li></ul></ul><ul><ul><li>сериализируеми </li></ul></ul>public enum Color { WHITE, RED, GREEN, BLUE, BLACK }
  10. 10. Изброени типове (enums) <ul><li>Позволени са операторите if и switch : </li></ul>switch (color) { case WHITE: System.out.println(&quot;бяло&quot;); break; case RED: System.out.println(&quot;червено&quot;); break; ... } if (color == Color.RED) { ... }
  11. 11. Изброени типове (enums) <ul><li>Дефинирани са стандартни методи ordinal() и values() : </li></ul>public static void main(String[] args) { Color color = Color.RED; System.out.println(&quot;color = &quot; + color); int value = color.ordinal(); System.out.println(&quot;value = &quot; + value); for(Color c : Color.values()) { System.out.println(&quot;Color.&quot; + c + &quot; = &quot; + c.ordinal()); } }
  12. 12. Статично включване <ul><li>Статичното включване на клас ( static import) позволява директно използване на неговите членове: </li></ul>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( &quot;PI = &quot; + PI + &quot;, sin(PI/2) = &quot; + sin(PI/2) ); }
  13. 13. Променлив брой аргументи <ul><li>Вече можем да дефинираме методи с променлив брой аргументи: </li></ul>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. 14. Ковариантност на връщания тип <ul><li>При имплементация на интерфейси методите могат да връщат вместо типа, обявен в интерфейса, негов наследник: </li></ul>interface SomeInterface { public Object someMethod(); } public class C implements SomeInterface { public String someMethod() { return &quot;I return String &quot; + &quot; instead of Object&quot;; } }
  15. 15. Шаблонни типове <ul><li>Шаблонните типове ( generics) служат за дефиниране на параметризирани класове </li></ul><ul><li>Параметрите се дефинират се с ъглови скоби, като в C++. Например: </li></ul>public class Example<T> { private T mValue; public Example<T>(T aValue) { mValue = aValue; } public T getValue() { return mValue; } }
  16. 16. Шаблонни типове <ul><li>При деклариране на променлива от шаблонен тип се задават параметрите: </li></ul><ul><li>Допуска се инстанциране само по клас ( не може по примитивен тип ) </li></ul><ul><ul><li>Декларацията Example<int> е невалидна </li></ul></ul>Example<String> str = new Example<String>( &quot;Шаблони, маблони, макарони и купони &quot;); System.out.println(str.getValue()); Example< Double > d = new Example< Double >( 3.14159265 ); System.out.println( d .getValue());
  17. 17. Шаблонни типове <ul><li>Каква е ползата от шаблонните типове? </li></ul><ul><ul><li>Подобряване на четимостта на кода </li></ul></ul><ul><ul><li>Осигуряване на типова безопасност </li></ul></ul><ul><li>Къде се използват? </li></ul><ul><ul><li>Най-вече колекции – Vector , ArrayList , Hashtable , HashMap , … </li></ul></ul><ul><li>Как са реализирани? </li></ul><ul><ul><li>На ниво компилатор е добавена проверка за съответствието на типовете </li></ul></ul><ul><ul><li>Параметрите се представят вътрешно като Object и не съществуват по време на изпълнение </li></ul></ul>
  18. 18. Шаблонни колекции <ul><li>Всички стандартни колекции в JDK 1.5 вече са шаблонни: </li></ul>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(&quot;Бай Киро&quot;, 83); int kiroAge = ageMap.get(&quot;Бай Киро&quot;);
  19. 19. Шаблонни колекции <ul><li>Шаблонните колекции могат да се обхождат директно с новия синтаксис за for - цикъл: </li></ul>ArrayList <Person> personsList = new ArrayList <Person> (); personsList.add(new Person(&quot;Бай Иван&quot;)); personsList.add(new Person(&quot;Цар Киро&quot;)); personsList.add(new Person(&quot;Баба Яга&quot;)); for ( Person person : personsList) { System.out.println(person); }
  20. 20. <ul><li>Възможно е ограничаване на типа на параметрите на шаблонен клас: </li></ul>Шаблонни типове class Example<T extends Person> { ... } class Example2<T extends Shape & Movable, Transformable> { ... } void fill(List<? extends Shape> aList) { ... }
  21. 21. Шаблонни методи <ul><li>Методите също могат да бъдат шаблонни, независимо от класовете: </li></ul>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. 22. Демонстрация <ul><li>Използване на шаблонни </li></ul><ul><li>типове ( generics) </li></ul>
  23. 23. Анотации <ul><li>Анотациите позволяват прикрепяне на метаданни към декларациите в кода (класове , методи, член-променливи, ...) </li></ul><ul><li>Много приличат на атрибутите в .NET </li></ul><ul><li>Задават се с @S ome A nnotation </li></ul><ul><li>Не променят семантиката на програмата </li></ul><ul><li>Обработват се от инструменти, които ги разпознават </li></ul><ul><li>Могат да приемат параметри </li></ul><ul><li>Могат да се дефинират от програмиста </li></ul>
  24. 24. Анотации <ul><li>Декларация на интерфейс за анотации: </li></ul>@Retention(RetentionPolicy.RUNTIME) @interface Author { String name(); } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface Optimize { String level() default &quot;release&quot; ; boolean threadSafe(); String lastCheckDate(); // java.util.Date not allowed! }
  25. 25. Анотации <ul><li>Използване на анотации в кода: </li></ul>@ A uthor(name=&quot;Svetlin Nakov&quot;) public class AnnotDemo { @ O ptimize(level=&quot;debug&quot;, threadSafe=false, lastCheckDate=&quot;20.07.2004&quot;) public void test () { ... } }
  26. 26. Анотации <ul><li>Анотациите са наследници на java.lang.anotation.Anotation </li></ul><ul><li>Могат да се извличат чрез reflection: </li></ul>import java.lang.annotation.*; Annotation classAnnot = AnnotDemo.class. getAnnotation(Author.class); System.out.println(&quot;AnnotDemo class &quot; + &quot;has annotation: &quot; + classAnnot); Author classAuthor = (Author) classAnnot; System.out.println(&quot;AnnotDemo has &quot; + &quot;author: &quot; + classAuthor.name());
  27. 27. Анотации <ul><li>Анотациите постепенно ще заместват външните XML конфигурационни файлове, масово използвани в J2EE </li></ul>// EJB 3.0 session bean @Session public class Sample Session Bean { private DataSource customerDB; @Inject private void setCustomerDB( DataSource customerDB) { this.customerDB = customerDB; } ... }
  28. 28. Демонстрация <ul><li>Използване на анотации </li></ul>
  29. 29. Нови класове в JDK 1.5 <ul><li>Разширения на стандартните библиотеки </li></ul><ul><ul><li>Клас java.lang.StringBuilder – като StringBuffer , но не е синхронизиран (и съответно е по-бърз) </li></ul></ul><ul><ul><li>Клас java.util.Formatter – за форматиране, подобно на sprintf() в C </li></ul></ul><ul><ul><li>Клас java.util.Scanner – за форматиран вход от потоци и файлове </li></ul></ul><ul><ul><li>Класът java.io.PrintStream има метод printf() за форматиран изход </li></ul></ul><ul><ul><li>Нови колекции в java.util – Queue , Stack , PriorityQueue </li></ul></ul>
  30. 30. Форматиран вход/изход Date now = new java.util.Date(); System.out.printf(&quot;Today is &quot; + &quot;%1$te.%1$tm.%1$tY&quot;, now); String name = &quot;Svetlin Nakov&quot;; int count = 15; System.out.printf(&quot;Welcome, %1$s. You &quot; + &quot;are visitior %2$d. &quot;, name, count); Scanner sc = new Scanner(System.in); int value = sc.nextInt(); System.out.printf(&quot;value = %1$d&quot;, value);
  31. 31. Конкурентно програмиране <ul><li>Новото API за конкурентно програмиране ( java.util.concurrent ) предоставя: </li></ul><ul><ul><li>Executors, Thread pools, Callables </li></ul></ul><ul><ul><li>BlockingQueue , ConcurrentHashMap </li></ul></ul><ul><ul><li>Locks – ( ReentrantLock , ReadWriteLock ) – lock() , unlock() , tryLock() </li></ul></ul><ul><ul><li>Conditions – await() , signal() </li></ul></ul><ul><ul><li>Атомарни променливи – AtomicBoolean , AtomicInteger , AtomicReference – incrementAndGet() , getAndSet( … ) , compareAndSet( … ) </li></ul></ul>
  32. 32. Executors <ul><li>Изпълнителите ( executors) са обекти, които изпълняват задачи </li></ul><ul><li>Могат да стартират задачите синхронно или асинхронно: </li></ul><ul><ul><li>в текущата нишка ( thread ) </li></ul></ul><ul><ul><li>в отделни нишки ( threads) </li></ul></ul><ul><ul><li>в thread pools </li></ul></ul><ul><ul><ul><li>ограничени или неограничени </li></ul></ul></ul><ul><ul><li>последователно една след друга </li></ul></ul><ul><ul><li>на определено време </li></ul></ul>
  33. 33. Executors <ul><li>Класът java.util.concurrent.Executors има методи за създаване на различни изпълнители (executors) </li></ul><ul><ul><li>newSingleThreadExecutor() – опашка със задачи – изпълняват се една по една по реда на постъпване </li></ul></ul><ul><ul><li>newFixedThreadPool(int x) – thread pool с x работни нишки – изпълнява по x задачи едновременно </li></ul></ul><ul><ul><li>newCachedThreadPool() – класически thread pool – изпълнява всички задачи едновременно и ползва thread reuse </li></ul></ul>
  34. 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(&quot;t&quot; + (i+1))); } // Destroy the pool after all tasks get finished pool.shutdown();
  35. 35. Демонстрация <ul><li>Използване на thread pools </li></ul>
  36. 36. Други новости в JDK 1.5 <ul><li>Подобрения в RMI </li></ul><ul><ul><li>Динамично генериране на stub класове по време на изпълнение </li></ul></ul><ul><li>Нови row sets в JDBC </li></ul><ul><ul><li>JdbcRowSet , FilteredRowSet , JoinRowSet , CachedRowSet ( disconnected row set ), WebRowSet ( XML based) </li></ul></ul><ul><li>Monitoring & Manageability API </li></ul><ul><ul><li>Средства за наблюдение на виртуалната машина (памет, ресурси, натоварване, ...) </li></ul></ul><ul><ul><li>JMX (Java Management Extensions) в JVM </li></ul></ul>
  37. 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. 38. <ul><li>Новости в XML библиотеките </li></ul><ul><ul><li>XML 1.1, SAX 2, DOM 3, XSLT </li></ul></ul><ul><li>Non-blocking версия на класовете SSLSocket и SSLServerSocket </li></ul><ul><li>Подобрения във виртуалната машина </li></ul><ul><ul><li>Class Data Sharing </li></ul></ul><ul><ul><ul><li>JVM използва memory-mapped файлове, за да ускори зареждането на големи JAR архиви </li></ul></ul></ul><ul><ul><ul><li>Общите JAR файлове се зареждат в обща за различните инстанции на JVM памет </li></ul></ul></ul>Още новости в JDK 1.5
  39. 39. <ul><li>Подобрения в Desktop GUI библиотеките </li></ul><ul><ul><li>Подобрения в скоростта </li></ul></ul><ul><ul><li>Java2D може да ползва OpenGL </li></ul></ul><ul><ul><li>XAWT – Олекотена AWT библиотека за X11 терминали </li></ul></ul><ul><ul><li>Нови look-and-feel схеми </li></ul></ul>Още новости в JDK 1.5
  40. 40. За повече информация <ul><li>За download на JDK 1.5 beta 2 : </li></ul><ul><ul><li>http://java.sun.com/j2se/1.5.0/download.jsp </li></ul></ul><ul><li>Технически преглед: </li></ul><ul><ul><li>http://java.sun.com/developer/technicalArticles/releases/j2se15/ </li></ul></ul><ul><li>New Features of J2SE 1.5 (Tiger): </li></ul><ul><ul><li>http://www.javacommunity.org/conference/5th/data/2_1.pdf </li></ul></ul><ul><li>Java JDK 1.5 : </li></ul><ul><ul><li>http://www.tyma.com/tymajdk15.pdf </li></ul></ul>
  41. 41. Новости в JDK 1.5 <ul><li>Въпроси? </li></ul>

×