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

JDK 1.5 New Features

Embed Size (px)

DESCRIPTION

Принципи при дизайна на 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 библиотеките. Подобрения във виртуалната машина.

Citation preview

Новости в Новости в JDK 1.5JDK 1.5

Светлин НаковСветлин Наков

www.devbg.orgwww.devbg.org

СъдържаниеСъдържаниеСъдържаниеСъдържание

• Принципи при дизайна на Принципи при дизайна на JDK 1.5JDK 1.5• Нововъведения в езика Нововъведения в езика JavaJava• Автоматично опаковане и разопаковане Автоматично опаковане и разопаковане

((boxing boxing и и unboxing)unboxing)• Разширен синтаксис на Разширен синтаксис на forfor--циклитециклите• Изброени типове (Изброени типове (enumerations)enumerations)• Статично включване (Статично включване (static import)static import)• Методи с променлив брой аргументиМетоди с променлив брой аргументи• Ковариантност на връщания типКовариантност на връщания тип• Шаблонни типове (Шаблонни типове (generics)generics)• Метаданни в кода (Метаданни в кода (annotations)annotations)

• Принципи при дизайна на Принципи при дизайна на JDK 1.5JDK 1.5• Нововъведения в езика Нововъведения в езика JavaJava• Автоматично опаковане и разопаковане Автоматично опаковане и разопаковане

((boxing boxing и и unboxing)unboxing)• Разширен синтаксис на Разширен синтаксис на forfor--циклитециклите• Изброени типове (Изброени типове (enumerations)enumerations)• Статично включване (Статично включване (static import)static import)• Методи с променлив брой аргументиМетоди с променлив брой аргументи• Ковариантност на връщания типКовариантност на връщания тип• Шаблонни типове (Шаблонни типове (generics)generics)• Метаданни в кода (Метаданни в кода (annotations)annotations)

СъдържаниеСъдържаниеСъдържаниеСъдържание

• Разширения на стандартните библиотекиРазширения на стандартните библиотеки• Класът Класът StringBuilderStringBuilder• Класовете Класовете FormatterFormatter и и ScannerScanner• Нови контейнер-класове: Нови контейнер-класове: QueueQueue, , StackStack, , PriorityQueuePriorityQueue, , ConcurentQueueConcurentQueue

• НовНовo APIo API за конкурентно програмиране за конкурентно програмиране• Динамични стъбове за RMIДинамични стъбове за RMI• Новости в Новости в JDBC – New Row SetsJDBC – New Row Sets• Monitoring & Manageability Monitoring & Manageability API (JMX)API (JMX)• Новости в Новости в XMLXML библиотеките библиотеките

• Подобрения във виртуалната машинаПодобрения във виртуалната машина

• Разширения на стандартните библиотекиРазширения на стандартните библиотеки• Класът Класът StringBuilderStringBuilder• Класовете Класовете FormatterFormatter и и ScannerScanner• Нови контейнер-класове: Нови контейнер-класове: QueueQueue, , StackStack, , PriorityQueuePriorityQueue, , ConcurentQueueConcurentQueue

• НовНовo APIo API за конкурентно програмиране за конкурентно програмиране• Динамични стъбове за RMIДинамични стъбове за RMI• Новости в Новости в JDBC – New Row SetsJDBC – New Row Sets• Monitoring & Manageability Monitoring & Manageability API (JMX)API (JMX)• Новости в Новости в XMLXML библиотеките библиотеките

• Подобрения във виртуалната машинаПодобрения във виртуалната машина

История на езика История на езика JavaJavaИстория на езика История на езика JavaJava

• 1995 (1.0) – Java 1995 (1.0) – Java се появява за първи пътсе появява за първи път

• 1997 (1.1) – 1997 (1.1) – Добавени са вложени класовеДобавени са вложени класове

• 2001 (1.4) – 2001 (1.4) – Добавени са Добавени са assertionsassertions

• 2004 (1.5) – 2004 (1.5) – Значителни промени в Значителни промени в синтаксиса на езика – синтаксиса на езика – enums, generics, enums, generics, annotations, …annotations, …

• Излиза официално в края на август 2004Излиза официално в края на август 2004

• Рекламира се още като Рекламира се още като Java 5Java 5 PlatformPlatform

• P.S. P.S. Ако някой твърди, че има 10 години Ако някой твърди, че има 10 години опит с опит с Java, Java, не му вярвайте!не му вярвайте!

• 1995 (1.0) – Java 1995 (1.0) – Java се появява за първи пътсе появява за първи път

• 1997 (1.1) – 1997 (1.1) – Добавени са вложени класовеДобавени са вложени класове

• 2001 (1.4) – 2001 (1.4) – Добавени са Добавени са assertionsassertions

• 2004 (1.5) – 2004 (1.5) – Значителни промени в Значителни промени в синтаксиса на езика – синтаксиса на езика – enums, generics, enums, generics, annotations, …annotations, …

• Излиза официално в края на август 2004Излиза официално в края на август 2004

• Рекламира се още като Рекламира се още като Java 5Java 5 PlatformPlatform

• P.S. P.S. Ако някой твърди, че има 10 години Ако някой твърди, че има 10 години опит с опит с Java, Java, не му вярвайте!не му вярвайте!

Принципи, залегнали в Принципи, залегнали в JDK 1.5JDK 1.5Принципи, залегнали в Принципи, залегнали в JDK 1.5JDK 1.5

• Улесняване на разработчикаУлесняване на разработчика

• Спестяване писането на досаден кодСпестяване писането на досаден код

• Подобряване производителносттаПодобряване производителността

• Максимална съвместимост с Максимална съвместимост с предходните версиипредходните версии

• Улесняване на разработчикаУлесняване на разработчика

• Спестяване писането на досаден кодСпестяване писането на досаден код

• Подобряване производителносттаПодобряване производителността

• Максимална съвместимост с Максимална съвместимост с предходните версиипредходните версии

Auto boxing/unboxingAuto boxing/unboxingAuto boxing/unboxingAuto boxing/unboxing

• Автоматичното опаковане и разопаковане Автоматичното опаковане и разопаковане (boxing/unboxing) (boxing/unboxing) на примитивните типове на примитивните типове спестява писане на досаден кодспестява писане на досаден код

• Boxing = Boxing = примитивен примитивен wrapper class, wrapper class, например например intint Integer Integer

• Unboxing = wrapper classUnboxing = wrapper class примитивен примитивен, , например например Long Long long long

• Автоматичното опаковане и разопаковане Автоматичното опаковане и разопаковане (boxing/unboxing) (boxing/unboxing) на примитивните типове на примитивните типове спестява писане на досаден кодспестява писане на досаден код

• Boxing = Boxing = примитивен примитивен wrapper class, wrapper class, например например intint Integer Integer

• Unboxing = wrapper classUnboxing = wrapper class примитивен примитивен, , например например Long Long long long

ArrayList list = new ArrayList();ArrayList list = new ArrayList();list.add(5); list.add(5); // auto boxing: int --> Integer// auto boxing: int --> Integer

Integer i = (Integer) list.get(0); Integer i = (Integer) list.get(0); int i2 = i; int i2 = i; // auto unboxing: Integer --> int// auto unboxing: Integer --> int

Разширение на Разширение на forfor--циклитециклитеРазширение на Разширение на forfor--циклитециклите

• Стандартният оператор за Стандартният оператор за forfor--цикъл има цикъл има разширен синтаксис за обхождане на разширен синтаксис за обхождане на колекции и масиви:колекции и масиви:

• Стандартният оператор за Стандартният оператор за forfor--цикъл има цикъл има разширен синтаксис за обхождане на разширен синтаксис за обхождане на колекции и масиви:колекции и масиви:

Person[] persons = new Person[] {Person[] persons = new Person[] { new Person("Бай Иван"),new Person("Бай Иван"), new Person("Цар Киро"),new Person("Цар Киро"), new Person("Баба Яга")new Person("Баба Яга")};};

for (Person p : persons) {for (Person p : persons) { System.out.println(p);System.out.println(p);}}

Разширение на Разширение на forfor--циклитециклитеРазширение на Разширение на forfor--циклитециклите

• При обхождане на колекции все още При обхождане на колекции все още трябва да се преобразуват типовете:трябва да се преобразуват типовете:

• По-нататък ще видим как този проблем се По-нататък ще видим как този проблем се решава чрез шаблони (решава чрез шаблони (genericsgenerics))

• При обхождане на колекции все още При обхождане на колекции все още трябва да се преобразуват типовете:трябва да се преобразуват типовете:

• По-нататък ще видим как този проблем се По-нататък ще видим как този проблем се решава чрез шаблони (решава чрез шаблони (genericsgenerics))

ArrayList personsList = new ArrayList();ArrayList personsList = new ArrayList();

personsList.add(new Person("Бай Иван"));personsList.add(new Person("Бай Иван"));personsList.add(new Person("Цар Киро"));personsList.add(new Person("Цар Киро"));personsList.add(new Person("Баба Яга"));personsList.add(new Person("Баба Яга"));

for (Object obj : personsList) {for (Object obj : personsList) { Person person = (Person) obj;Person person = (Person) obj; System.out.println(person);System.out.println(person);}}

Изброени типовеИзброени типове (enums) (enums)Изброени типовеИзброени типове (enums) (enums)

• Изброени типовеИзброени типове (enums (enums) в JDK 1.5) в JDK 1.5

• силно типизиранисилно типизирани

• приемат стойности само измежду приемат стойности само измежду предварително дефинирано множествопредварително дефинирано множество

• компилират се до класове, наследници на компилират се до класове, наследници на java.lang.Enumjava.lang.Enum

• сериализируемисериализируеми

• Изброени типовеИзброени типове (enums (enums) в JDK 1.5) в JDK 1.5

• силно типизиранисилно типизирани

• приемат стойности само измежду приемат стойности само измежду предварително дефинирано множествопредварително дефинирано множество

• компилират се до класове, наследници на компилират се до класове, наследници на java.lang.Enumjava.lang.Enum

• сериализируемисериализируеми

public enum Color {public enum Color { WHITE, RED, GREEN, BLUE, BLACKWHITE, RED, GREEN, BLUE, BLACK}}

Изброени типовеИзброени типове (enums) (enums)Изброени типовеИзброени типове (enums) (enums)

switch (color) {switch (color) { case WHITE: case WHITE: System.out.println("бяло"); System.out.println("бяло"); break;break; case RED: case RED: System.out.println("червено"); System.out.println("червено"); break;break; ......}}

if (color == Color.RED) {if (color == Color.RED) { ......}}

• Позволени са операторите Позволени са операторите ifif и и switchswitch::• Позволени са операторите Позволени са операторите ifif и и switchswitch::

Изброени типовеИзброени типове (enums) (enums)Изброени типовеИзброени типове (enums) (enums)

public static void main(String[] args) {public static void main(String[] args) { Color color = Color.RED;Color color = Color.RED; System.out.println("color = " + color);System.out.println("color = " + color);

int value = color.ordinal();int value = color.ordinal(); System.out.println("value = " + value);System.out.println("value = " + value);

for(Color c : Color.values()) {for(Color c : Color.values()) { System.out.println("Color." + c +System.out.println("Color." + c + " = " + c.ordinal());" = " + c.ordinal()); }}}}

• Дефинирани са стандартни методи Дефинирани са стандартни методи ordinal()ordinal() ии values()values()::

• Дефинирани са стандартни методи Дефинирани са стандартни методи ordinal()ordinal() ии values()values()::

Статично включванеСтатично включванеСтатично включванеСтатично включване

• Статичното включване на клас (Статичното включване на клас (static static import)import) позволява директно използване позволява директно използване на неговите членове:на неговите членове:

• Статичното включване на клас (Статичното включване на клас (static static import)import) позволява директно използване позволява директно използване на неговите членове:на неговите членове:

import static java.lang.Math.*;import static java.lang.Math.*;

public static void main(String[] args) {public static void main(String[] args) { // Пишем директно PI, а не Math.PI// Пишем директно PI, а не Math.PI

// и // и sin(PI/2), sin(PI/2), а не а не Math.sin(Math.PI/2)Math.sin(Math.PI/2)

System.out.println(System.out.println( "PI = " + PI + "PI = " + PI + ", sin(PI/2) = " + sin(PI/2)", sin(PI/2) = " + sin(PI/2) ););}}

Променлив брой аргументиПроменлив брой аргументиПроменлив брой аргументиПроменлив брой аргументи

• Вече можем да дефинираме методи с Вече можем да дефинираме методи с променлив брой аргументи:променлив брой аргументи:

• Вече можем да дефинираме методи с Вече можем да дефинираме методи с променлив брой аргументи:променлив брой аргументи:

double average(double ... aValues) {double average(double ... aValues) { double sum = 0;double sum = 0; for (double value : aValues) {for (double value : aValues) { sum = sum + value;sum = sum + value; }} double avg = sum / aValues.length;double avg = sum / aValues.length; return avg;return avg;}}

System.out.println(average(5,6));System.out.println(average(5,6));System.out.println(average(1,2,3,4,5));System.out.println(average(1,2,3,4,5));

Ковариантност на връщания типКовариантност на връщания типКовариантност на връщания типКовариантност на връщания тип

• При имплементация на интерфейси При имплементация на интерфейси методите могат да връщат вместо типа, методите могат да връщат вместо типа, обявен в интерфейса, негов наследник:обявен в интерфейса, негов наследник:

• При имплементация на интерфейси При имплементация на интерфейси методите могат да връщат вместо типа, методите могат да връщат вместо типа, обявен в интерфейса, негов наследник:обявен в интерфейса, негов наследник:

interface SomeInterface {interface SomeInterface { public Object someMethod();public Object someMethod();}}

public class Cpublic class C implements SomeInterfaceimplements SomeInterface {{ public String someMethod() {public String someMethod() { return "I return Stringreturn "I return String " + " + ""instead of Object";instead of Object"; }}}}

Шаблонни типовеШаблонни типовеШаблонни типовеШаблонни типове

• Шаблонните типове (Шаблонните типове (generics)generics) служат за служат за дефиниране на параметризирани класоведефиниране на параметризирани класове

• Параметрите се дефинират се с ъглови Параметрите се дефинират се с ъглови скоби, като в скоби, като в C++. C++. Например:Например:

• Шаблонните типове (Шаблонните типове (generics)generics) служат за служат за дефиниране на параметризирани класоведефиниране на параметризирани класове

• Параметрите се дефинират се с ъглови Параметрите се дефинират се с ъглови скоби, като в скоби, като в C++. C++. Например:Например:

public class Example<T> {public class Example<T> { private T mValue;private T mValue;

public Example<T>(T aValue) {public Example<T>(T aValue) { mValue = aValue;mValue = aValue; }}

public T getValue() {public T getValue() { return mValue;return mValue; }}}}

Шаблонни типовеШаблонни типовеШаблонни типовеШаблонни типове

• При деклариране на променлива от При деклариране на променлива от шаблонен тип се задават параметрите:шаблонен тип се задават параметрите:

• Допуска се инстанциране само по класДопуска се инстанциране само по клас ((не може по примитивен типне може по примитивен тип))

• ДекларациятаДекларацията Example<int>Example<int> е невалидна е невалидна

• При деклариране на променлива от При деклариране на променлива от шаблонен тип се задават параметрите:шаблонен тип се задават параметрите:

• Допуска се инстанциране само по класДопуска се инстанциране само по клас ((не може по примитивен типне може по примитивен тип))

• ДекларациятаДекларацията Example<int>Example<int> е невалидна е невалидна

Example<String> str = new Example<String>(Example<String> str = new Example<String>( "Шаблони, маблони, "Шаблони, маблони, макарони и купонимакарони и купони");");System.out.println(str.getValue());System.out.println(str.getValue());

Example<Example<DoubleDouble> > dd = = new Example<new Example<DoubleDouble>(>(3.141592653.14159265););System.out.println(System.out.println(dd.getValue());.getValue());

Шаблонни типовеШаблонни типовеШаблонни типовеШаблонни типове

• Каква е ползата от шаблонните типове?Каква е ползата от шаблонните типове?• Подобряване на четимостта на кодаПодобряване на четимостта на кода• Осигуряване на типова безопасностОсигуряване на типова безопасност

• Къде се използват?Къде се използват?• Най-вече колекции Най-вече колекции – – VectorVector, , ArrayListArrayList, , HashtableHashtable, , HashMapHashMap, …, …

• Как са реализирани?Как са реализирани?• На ниво компилатор е добавена проверка На ниво компилатор е добавена проверка

за съответствието на типоветеза съответствието на типовете• Параметрите се представят вътрешно Параметрите се представят вътрешно

като като ObjectObject и не съществуват по време и не съществуват по време на изпълнениена изпълнение

• Каква е ползата от шаблонните типове?Каква е ползата от шаблонните типове?• Подобряване на четимостта на кодаПодобряване на четимостта на кода• Осигуряване на типова безопасностОсигуряване на типова безопасност

• Къде се използват?Къде се използват?• Най-вече колекции Най-вече колекции – – VectorVector, , ArrayListArrayList, , HashtableHashtable, , HashMapHashMap, …, …

• Как са реализирани?Как са реализирани?• На ниво компилатор е добавена проверка На ниво компилатор е добавена проверка

за съответствието на типоветеза съответствието на типовете• Параметрите се представят вътрешно Параметрите се представят вътрешно

като като ObjectObject и не съществуват по време и не съществуват по време на изпълнениена изпълнение

Шаблонни колекцииШаблонни колекцииШаблонни колекцииШаблонни колекции

• Всички стандартни колекции в Всички стандартни колекции в JDKJDK 1.5 1.5 вече са шаблонни:вече са шаблонни:

• Всички стандартни колекции в Всички стандартни колекции в JDKJDK 1.5 1.5 вече са шаблонни:вече са шаблонни:

import java.util.*;import java.util.*;

ArrayList<Integer> list =ArrayList<Integer> list = new ArrayList<Integer>();new ArrayList<Integer>();list.add(5);list.add(5);int value = list.get(0);int value = list.get(0);

HashMap<String, Integer> ageMap =HashMap<String, Integer> ageMap = new HashMap<String, Integer>();new HashMap<String, Integer>();ageMap.put("Бай Киро", 83);ageMap.put("Бай Киро", 83);int kiroAge = ageMap.get("Бай Киро");int kiroAge = ageMap.get("Бай Киро");

Шаблонни колекцииШаблонни колекцииШаблонни колекцииШаблонни колекции

• Шаблонните колекции могат да се Шаблонните колекции могат да се обхождат директно с новия синтаксис за обхождат директно с новия синтаксис за forfor--цикъл:цикъл:

• Шаблонните колекции могат да се Шаблонните колекции могат да се обхождат директно с новия синтаксис за обхождат директно с новия синтаксис за forfor--цикъл:цикъл:

ArrayListArrayList<Person><Person> personsList = personsList = new ArrayListnew ArrayList<Person><Person>();();

personsList.add(new Person("Бай Иван"));personsList.add(new Person("Бай Иван"));personsList.add(new Person("Цар Киро"));personsList.add(new Person("Цар Киро"));personsList.add(new Person("Баба Яга"));personsList.add(new Person("Баба Яга"));

for (for (PersonPerson personperson : personsList) { : personsList) { System.out.println(person);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)generics)

Използване на шаблонниИзползване на шаблоннитипове (типове (generics)generics)

АнотацииАнотацииАнотацииАнотации

• Анотациите позволяват прикрепяне на Анотациите позволяват прикрепяне на метаданни към декларациите в кода метаданни към декларациите в кода (класове(класове,, методи, член-променливи, ...) методи, член-променливи, ...)

• Много приличат на атрибутите в Много приличат на атрибутите в .NET.NET

• Задават се с Задават се с @S@SomeomeAAnnotationnnotation

• Не променят семантиката на програматаНе променят семантиката на програмата

• Обработват се от инструменти, които ги Обработват се от инструменти, които ги разпознаватразпознават

• Могат да приемат параметриМогат да приемат параметри

• Могат да се дефинират от програмистаМогат да се дефинират от програмиста

• Анотациите позволяват прикрепяне на Анотациите позволяват прикрепяне на метаданни към декларациите в кода метаданни към декларациите в кода (класове(класове,, методи, член-променливи, ...) методи, член-променливи, ...)

• Много приличат на атрибутите в Много приличат на атрибутите в .NET.NET

• Задават се с Задават се с @S@SomeomeAAnnotationnnotation

• Не променят семантиката на програматаНе променят семантиката на програмата

• Обработват се от инструменти, които ги Обработват се от инструменти, които ги разпознаватразпознават

• Могат да приемат параметриМогат да приемат параметри

• Могат да се дефинират от програмистаМогат да се дефинират от програмиста

АнотацииАнотацииАнотацииАнотации

• Декларация на интерфейс за анотации:Декларация на интерфейс за анотации:• Декларация на интерфейс за анотации:Декларация на интерфейс за анотации:

@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.Anotationjava.lang.anotation.Anotation

• Могат да се извличат чрез Могат да се извличат чрез reflection:reflection:

• Анотациите са наследници на Анотациите са наследници на java.lang.anotation.Anotationjava.lang.anotation.Anotation

• Могат да се извличат чрез Могат да се извличат чрез reflection: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 XML конфигурационни конфигурационни файлове, масово използвани в файлове, масово използвани в J2EEJ2EE

• Анотациите постепенно ще заместват Анотациите постепенно ще заместват външните външните XML XML конфигурационни конфигурационни файлове, масово използвани в файлове, масово използвани в J2EEJ2EE

// EJB 3.0 session bean

@Session public class SampleSessionBean {

private DataSource customerDB;

@Inject private void setCustomerDB( DataSource customerDB) { this.customerDB = customerDB; }

...}

ДемонстрацияДемонстрацияДемонстрацияДемонстрация

Използване на анотацииИзползване на анотацииИзползване на анотацииИзползване на анотации

Нови класовеНови класове в в JDK 1.5JDK 1.5Нови класовеНови класове в в JDK 1.5JDK 1.5

• Разширения на стандартните библиотекиРазширения на стандартните библиотеки• Клас Клас java.lang.StringBuilderjava.lang.StringBuilder – като – като StringBufferStringBuffer, но не е синхронизиран (и , но не е синхронизиран (и съответно е по-бърз)съответно е по-бърз)

• Клас Клас java.util.Formatterjava.util.Formatter – за – за форматиране, подобно на форматиране, подобно на sprintf()sprintf() в C в C

• Клас Клас java.util.Scannerjava.util.Scanner – за – за форматиран вход от потоци и файловеформатиран вход от потоци и файлове

• Класът Класът java.io.PrintStreamjava.io.PrintStream има метод има метод printf()printf() за форматиран изход за форматиран изход

• Нови колекции в Нови колекции в java.utiljava.util – – QueueQueue, , StackStack, , PriorityQueuePriorityQueue

• Разширения на стандартните библиотекиРазширения на стандартните библиотеки• Клас Клас java.lang.StringBuilderjava.lang.StringBuilder – като – като StringBufferStringBuffer, но не е синхронизиран (и , но не е синхронизиран (и съответно е по-бърз)съответно е по-бърз)

• Клас Клас java.util.Formatterjava.util.Formatter – за – за форматиране, подобно на форматиране, подобно на sprintf()sprintf() в C в C

• Клас Клас java.util.Scannerjava.util.Scanner – за – за форматиран вход от потоци и файловеформатиран вход от потоци и файлове

• Класът Класът java.io.PrintStreamjava.io.PrintStream има метод има метод printf()printf() за форматиран изход за форматиран изход

• Нови колекции в Нови колекции в java.utiljava.util – – QueueQueue, , StackStack, , PriorityQueuePriorityQueue

Форматиран вход/изходФорматиран вход/изходФорматиран вход/изходФорматиран вход/изход

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 за конкурентно програмиране Новото API за конкурентно програмиране ((java.util.concurrentjava.util.concurrent) предоставя:) предоставя:

• Executors, Thread pools, CallablesExecutors, Thread pools, Callables

• BlockingQueueBlockingQueue, , ConcurrentHashMapConcurrentHashMap

• Locks – (Locks – (ReentrantLockReentrantLock, , ReadWriteLockReadWriteLock) ) – – lock()lock(), , unlock()unlock(), , tryLock()tryLock()

• ConditionsConditions – – await()await(), , signal()signal()

• Атомарни променливи – Атомарни променливи – AtomicBooleanAtomicBoolean, , AtomicIntegerAtomicInteger, , AtomicReferenceAtomicReference – – incrementAndGet()incrementAndGet(), , getAndSet(getAndSet(……)), , compareAndSet(compareAndSet(……))

• Новото API за конкурентно програмиране Новото API за конкурентно програмиране ((java.util.concurrentjava.util.concurrent) предоставя:) предоставя:

• Executors, Thread pools, CallablesExecutors, Thread pools, Callables

• BlockingQueueBlockingQueue, , ConcurrentHashMapConcurrentHashMap

• Locks – (Locks – (ReentrantLockReentrantLock, , ReadWriteLockReadWriteLock) ) – – lock()lock(), , unlock()unlock(), , tryLock()tryLock()

• ConditionsConditions – – await()await(), , signal()signal()

• Атомарни променливи – Атомарни променливи – AtomicBooleanAtomicBoolean, , AtomicIntegerAtomicInteger, , AtomicReferenceAtomicReference – – incrementAndGet()incrementAndGet(), , getAndSet(getAndSet(……)), , compareAndSet(compareAndSet(……))

ExecutorsExecutorsExecutorsExecutors

• Изпълнителите (Изпълнителите (executors)executors) са обекти, са обекти, които изпълняват задачикоито изпълняват задачи

• Могат да стартират задачите синхронно Могат да стартират задачите синхронно или асинхронно:или асинхронно:

• в текущата нишка (в текущата нишка (threadthread))

• в отделни нишки (в отделни нишки (threads)threads)

• в в thread poolsthread pools

• ограничени или неограничениограничени или неограничени

• последователно една след другапоследователно една след друга

• на определено времена определено време

• Изпълнителите (Изпълнителите (executors)executors) са обекти, са обекти, които изпълняват задачикоито изпълняват задачи

• Могат да стартират задачите синхронно Могат да стартират задачите синхронно или асинхронно:или асинхронно:

• в текущата нишка (в текущата нишка (threadthread))

• в отделни нишки (в отделни нишки (threads)threads)

• в в thread poolsthread pools

• ограничени или неограничениограничени или неограничени

• последователно една след другапоследователно една след друга

• на определено времена определено време

ExecutorsExecutorsExecutorsExecutors

• Класът Класът java.util.concurrent.Executorsjava.util.concurrent.Executors има методи за създаване на различни има методи за създаване на различни изпълнители (executors)изпълнители (executors)• newSingleThreadExecutor() – опашка

със задачи – изпълняват се една по една по реда на постъпване

• newFixedThreadPool(int x) – thread pool с x работни нишки – изпълнява по x задачи едновременно

• newCachedThreadPool() – класически thread pool – изпълнява всички задачи едновременно и ползва thread reuse

• Класът Класът java.util.concurrent.Executorsjava.util.concurrent.Executors има методи за създаване на различни има методи за създаване на различни изпълнители (executors)изпълнители (executors)• newSingleThreadExecutor() – опашка

със задачи – изпълняват се една по една по реда на постъпване

• newFixedThreadPool(int x) – thread pool с x работни нишки – изпълнява по x задачи едновременно

• newCachedThreadPool() – класически thread pool – изпълнява всички задачи едновременно и ползва thread reuse

Executors – Executors – примерпримерExecutors – 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 poolsthread poolsИзползване на Използване на thread poolsthread pools

Други новости в Други новости в JDK JDK 1.51.5Други новости в Други новости в JDK JDK 1.51.5

• Подобрения в RMIПодобрения в RMI

• Динамично генериране на stub класове по Динамично генериране на stub класове по време на изпълнениевреме на изпълнение

• Нови row sets в JDBCНови row sets в JDBC• JdbcRowSetJdbcRowSet, , FilteredRowSetFilteredRowSet, , JoinRowSetJoinRowSet, , CachedRowSetCachedRowSet ( (disconnected disconnected row setrow set), ), WebRowSetWebRowSet ((XML based)XML based)

• Monitoring & Manageability APIMonitoring & Manageability API

• Средства за наблюдение на виртуалната Средства за наблюдение на виртуалната машина (памет, ресурси, натоварване, ...)машина (памет, ресурси, натоварване, ...)

• JMXJMX (Java Management Extensions) (Java Management Extensions) в в JVMJVM

• Подобрения в RMIПодобрения в RMI

• Динамично генериране на stub класове по Динамично генериране на stub класове по време на изпълнениевреме на изпълнение

• Нови row sets в JDBCНови row sets в JDBC• JdbcRowSetJdbcRowSet, , FilteredRowSetFilteredRowSet, , JoinRowSetJoinRowSet, , CachedRowSetCachedRowSet ( (disconnected disconnected row setrow set), ), WebRowSetWebRowSet ((XML based)XML based)

• Monitoring & Manageability APIMonitoring & Manageability API

• Средства за наблюдение на виртуалната Средства за наблюдение на виртуалната машина (памет, ресурси, натоварване, ...)машина (памет, ресурси, натоварване, ...)

• JMXJMX (Java Management Extensions) (Java Management Extensions) в в JVMJVM

Проследяване на стекаПроследяване на стекаПроследяване на стекаПроследяване на стека

// 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);

• Новости в XML библиотекитеНовости в XML библиотеките

• XML 1.1, SAX 2, DOM 3, XSLTXML 1.1, SAX 2, DOM 3, XSLT

• Non-blocking версия на класовете Non-blocking версия на класовете SSLSocketSSLSocket и и SSLServerSocketSSLServerSocket

• Подобрения във виртуалната машинаПодобрения във виртуалната машина

• Class Data SharingClass Data Sharing

• JVM използва memory-mapped файлове, за JVM използва memory-mapped файлове, за да ускори зареждането на големи JAR да ускори зареждането на големи JAR архивиархиви

• Общите JAR файлове се Общите JAR файлове се зареждат в обща зареждат в обща заза различните инстанции на JVM различните инстанции на JVM памет памет

• Новости в XML библиотекитеНовости в XML библиотеките

• XML 1.1, SAX 2, DOM 3, XSLTXML 1.1, SAX 2, DOM 3, XSLT

• Non-blocking версия на класовете Non-blocking версия на класовете SSLSocketSSLSocket и и SSLServerSocketSSLServerSocket

• Подобрения във виртуалната машинаПодобрения във виртуалната машина

• Class Data SharingClass Data Sharing

• JVM използва memory-mapped файлове, за JVM използва memory-mapped файлове, за да ускори зареждането на големи JAR да ускори зареждането на големи JAR архивиархиви

• Общите JAR файлове се Общите JAR файлове се зареждат в обща зареждат в обща заза различните инстанции на JVM различните инстанции на JVM памет памет

Още новости в Още новости в JDK JDK 1.51.5Още новости в Още новости в JDK JDK 1.51.5

• Подобрения в Подобрения в Desktop GUIDesktop GUI библиотеките библиотеките

• Подобрения в скоросттаПодобрения в скоростта

• Java2D може да ползва OpenGLJava2D може да ползва OpenGL

• XAWT – XAWT – Олекотена Олекотена AWTAWT библиотека за библиотека за X11 X11 терминалитерминали

• Нови Нови look-and-feel look-and-feel схемисхеми

• Подобрения в Подобрения в Desktop GUIDesktop GUI библиотеките библиотеките

• Подобрения в скоросттаПодобрения в скоростта

• Java2D може да ползва OpenGLJava2D може да ползва OpenGL

• XAWT – XAWT – Олекотена Олекотена AWTAWT библиотека за библиотека за X11 X11 терминалитерминали

• Нови Нови look-and-feel look-and-feel схемисхеми

Още новости в Още новости в JDK JDK 1.51.5Още новости в Още новости в JDK JDK 1.51.5

За повече информацияЗа повече информацияЗа повече информацияЗа повече информация

• За За downloaddownload на на JDK 1.5 beta 2JDK 1.5 beta 2::

• http://java.sun.com/j2se/1.5.0/download.jsphttp://java.sun.com/j2se/1.5.0/download.jsp

• Технически преглед:Технически преглед:

• http://java.sun.com/developer/technicalArtichttp://java.sun.com/developer/technicalArticles/releases/j2se15/les/releases/j2se15/

• New Features of J2SE 1.5 (Tiger):New Features of J2SE 1.5 (Tiger):

• http://www.javacommunity.org/conference/5http://www.javacommunity.org/conference/5th/data/2_1.pdfth/data/2_1.pdf

• Java JDK 1.5Java JDK 1.5::

• http://www.tyma.com/tymajdk15.pdfhttp://www.tyma.com/tymajdk15.pdf

• За За downloaddownload на на JDK 1.5 beta 2JDK 1.5 beta 2::

• http://java.sun.com/j2se/1.5.0/download.jsphttp://java.sun.com/j2se/1.5.0/download.jsp

• Технически преглед:Технически преглед:

• http://java.sun.com/developer/technicalArtichttp://java.sun.com/developer/technicalArticles/releases/j2se15/les/releases/j2se15/

• New Features of J2SE 1.5 (Tiger):New Features of J2SE 1.5 (Tiger):

• http://www.javacommunity.org/conference/5http://www.javacommunity.org/conference/5th/data/2_1.pdfth/data/2_1.pdf

• Java JDK 1.5Java JDK 1.5::

• http://www.tyma.com/tymajdk15.pdfhttp://www.tyma.com/tymajdk15.pdf

Новости в Новости в JDK 1.5JDK 1.5Новости в Новости в JDK 1.5JDK 1.5

Въпроси?Въпроси?Въпроси?Въпроси?