410 likes | 572 Views
Новости в JDK 1.5. Светлин Наков. www.devbg.org. Съдържание. Принципи при дизайна на JDK 1.5 Нововъведения в езика Java Автоматично опаковане и разопаковане ( boxing и unboxing) Разширен синтаксис на for - циклите Изброени типове ( enumerations) Статично включване ( static import)
E N D
Новости в JDK 1.5 Светлин Наков www.devbg.org
Съдържание • Принципи при дизайна на 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 библиотеките • Подобрения във виртуалната машина
История на езика 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, не му вярвайте!
Принципи, залегнали в JDK 1.5 • Улесняване на разработчика • Спестяване писането на досаден код • Подобряване производителността • Максимална съвместимост с предходните версии
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
Разширение на for-циклите • Стандартният оператор за for-цикъл има разширен синтаксис за обхождане на колекции и масиви: Person[] persons = new Person[] { new Person("Бай Иван"), new Person("Цар Киро"), new Person("Баба Яга") }; for (Person p : persons) { System.out.println(p); }
Разширение на 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); }
Изброени типове (enums) • Изброени типове (enums) в JDK 1.5 • силно типизирани • приемат стойности само измежду предварително дефинирано множество • компилират се до класове, наследници на java.lang.Enum • сериализируеми public enum Color { WHITE, RED, GREEN, BLUE, BLACK }
Изброени типове (enums) • Позволени са операторите ifи switch: switch (color) { case WHITE: System.out.println("бяло"); break; case RED: System.out.println("червено"); break; ... } if (color == Color.RED) { ... }
Изброени типове (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()); } }
Статично включване • Статичното включване на клас (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) ); }
Променлив брой аргументи • Вече можем да дефинираме методи с променлив брой аргументи: 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));
Ковариантност на връщания тип • При имплементация на интерфейси методите могат да връщат вместо типа, обявен в интерфейса, негов наследник: interface SomeInterface { public Object someMethod(); } public class Cimplements SomeInterface{ public String someMethod() { return "I return String " + "instead of Object"; } }
Шаблонни типове • Шаблонните типове (generics) служат за дефиниране на параметризирани класове • Параметрите се дефинират се с ъглови скоби, като в C++. Например: public class Example<T> { private T mValue; public Example<T>(T aValue) { mValue = aValue; } public T getValue() { return mValue; } }
Шаблонни типове • При деклариране на променлива от шаблонен тип се задават параметрите: • Допуска се инстанциране само по клас (не може по примитивен тип) • Декларацията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());
Шаблонни типове • Каква е ползата от шаблонните типове? • Подобряване на четимостта на кода • Осигуряване на типова безопасност • Къде се използват? • Най-вече колекции – Vector, ArrayList, Hashtable, HashMap, … • Как са реализирани? • На ниво компилатор е добавена проверка за съответствието на типовете • Параметрите се представят вътрешно като Objectи не съществуват по време на изпълнение
Шаблонни колекции • Всички стандартни колекции в 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("Бай Киро");
Шаблонни колекции • Шаблонните колекции могат да се обхождат директно с новия синтаксис за 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); }
Шаблонни типове • Възможно е ограничаване на типа на параметрите на шаблонен клас: class Example<T extends Person> { ... } class Example2<T extends Shape & Movable, Transformable> { ... } void fill(List<? extends Shape> aList) { ... }
Шаблонни методи • Методите също могат да бъдат шаблонни, независимо от класовете: 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); }
Демонстрация Използване на шаблонни типове (generics)
Анотации • Анотациите позволяват прикрепяне на метаданни към декларациите в кода (класове, методи, член-променливи, ...) • Много приличат на атрибутите в .NET • Задават се с @SomeAnnotation • Не променят семантиката на програмата • Обработват се от инструменти, които ги разпознават • Могат да приемат параметри • Могат да се дефинират от програмиста
Анотации • Декларация на интерфейс за анотации: @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! }
Анотации • Използване на анотации в кода: @Author(name="Svetlin Nakov") public class AnnotDemo { @Optimize(level="debug", threadSafe=false, lastCheckDate="20.07.2004") public void test() { ... } }
Анотации • Анотациите са наследници на 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());
Анотации • Анотациите постепенно ще заместват външните XML конфигурационни файлове, масово използвани в J2EE // EJB 3.0 session bean @Session public class SampleSessionBean { private DataSource customerDB; @Inject private void setCustomerDB( DataSource customerDB){ this.customerDB = customerDB; } ... }
Демонстрация Използване на анотации
Нови класовев JDK 1.5 • Разширения на стандартните библиотеки • Клас java.lang.StringBuilder – като StringBuffer, но не е синхронизиран (и съответно е по-бърз) • Клас java.util.Formatter – за форматиране, подобно на sprintf() в C • Клас java.util.Scanner – за форматиран вход от потоци и файлове • Класът java.io.PrintStream има метод printf() за форматиран изход • Нови колекции в java.util – Queue, Stack, PriorityQueue
Форматиран вход/изход 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);
Конкурентно програмиране • Новото 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(…)
Executors • Изпълнителите (executors) са обекти, които изпълняват задачи • Могат да стартират задачите синхронно или асинхронно: • в текущата нишка (thread) • в отделни нишки (threads) • в thread pools • ограничени или неограничени • последователно една след друга • на определено време
Executors • Класът java.util.concurrent.Executorsима методи за създаване на различни изпълнители (executors) • newSingleThreadExecutor() – опашка със задачи – изпълняват се една по една по реда на постъпване • newFixedThreadPool(int x) – thread pool с xработни нишки – изпълнява по xзадачи едновременно • newCachedThreadPool() – класически thread pool – изпълнява всички задачи едновременнои ползва thread reuse
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();
Демонстрация Използване на thread pools
Други новости в 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
Проследяване на стека // 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);
Още новости в 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 памет
Още новости в JDK 1.5 • Подобрения в Desktop GUI библиотеките • Подобрения в скоростта • Java2D може да ползва OpenGL • XAWT – Олекотена AWT библиотека за X11 терминали • Нови look-and-feel схеми
За повече информация • За 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
Новости в JDK 1.5 Въпроси?