Nowa maszyna na stół

Sun Microsystems opublikował wersję Beta 1 specyfikacji Java 2 Standard Edition (J2SE) 1.

Sun Microsystems opublikował wersję Beta 1 specyfikacji Java 2 Standard Edition (J2SE) 1.5.

J2SE 1.5 Beta 1 obejmuje specyfikacje dla platformy wykonawczej (JVM) oraz pakiet JDK zawierający definicje funkcji, obiektów i interfejsów programistycznych. Nowa wersja standardu ma być ostatecznie przyjęta w sierpniu br.

Każda kolejna wersja standardu Java zawiera zmiany postulowane przez twórców i użytkowników aplikacji zrzeszonych w Java Community Process w formie tzw. JSR (Java Specification Requests). JDK 1.5 w wersji Beta 1 realizuje aż piętnaście postulatów, obejmujących łącznie kilkadziesiąt większych i mniejszych udoskonaleń. J2SE 1.5 wprowadza kilka zmian w specyfikacji samego języka Java, kilkadziesiąt zmian w standardowych bibliotekach oraz udoskonalenia w maszynie wirtualnej.

Podstawowe zmiany wprowadzone w J2SE 1.5 mają na celu zwiększenie wygody programisty. Wśród głównych zmian wypada wskazać typy ogólne, metadane, mechanizm automatycznej konwersji oraz ułatwienia w konstrukcji pętli. Dysponując uznanym językiem programowania, Sun zajął się wreszcie przekształceniem go pod kątem narzędzi do szybkiego budowania aplikacji. Aby to osiągnąć, nieuniknione są zmiany w składni języka Java, co na tym etapie wydaje się nieco dziwne. Być może jednak lepiej późno niż wcale.

Programistom lżej

J2SE 1.5 wnosi ułatwienia pozwalające programiście uzyskiwać pożądaną funkcjonalność za pomocą mniejszej ilości kodu niż dotychczas - spora część kodu, którą w J2SE 1.3 i 1.4 programista musi pisać samodzielnie, w J2SE 1.5 jest automatycznie dopisywana przez kompilator. Oprócz mniejszej ilości pracy do wykonania, ogranicza to ryzyko popełnienia błędu.

W nowej wersji J2SE wprowadzono bardzo wygodny mechanizm pozwalający iterować elementy wskazanej kolekcji. Zamiast tworzyć instancję obiektu Iterator i pobierać go z kolekcji, można po prostu napisać foreach. Kompilator sam uzupełni kod wartościami i to posługując się typami ogólnymi, o czym dalej. W rezultacie program ma kilkadziesiąt znaków mniej.

Ciekawym pomysłem jest też importowanie wartości stałych z klasy. W J2SE 1.5 można odwoływać się do wartości stałej poprzez jej statyczny import z innej klasy - bez konieczności tworzenia obiektu pochodnego. Wystarczy więc wpisać deklarację import static Nazwa_Klasy_Użytkowej.*, gdzie "*" oznacza wszystkie wartości należące do tej klasy. Jest to lepsze podejście niż to, w którym wartości stałe są najpierw zapisywane w specjalnie w tym celu stworzonych interfejsach. Dziedziczenie wartości z interfejsu jest operacją publiczną, w związku z czym każda zmiana zapisanych w nim wartości niepotrzebnie wymaga zachowania rygoru zgodności binarnej kodu wynikowego. Poza tym import statyczny pozwala zrezygnować z podawania za każdym razem pełnej ścieżki dziedziczenia obiektu, co skraca kod.

Wraz z rosnącym skomplikowaniem aplikacji rośnie rola informacji dodatkowo opisujących kod - metadanych. Pozwalają one dodać do kodu aplikacji "komentarz", który może być w naturalny sposób przetworzony przez kompilator. W ten sposób, np. zamiast dziedziczenia z odpowiedniej klasy, można wskazywać na funkcje wywoływane mechanizmem RMI albo definiować parametry instalacji komponentu.

Mechanizm analogiczny do metadanych sprawdził się w rozwiązaniu portalowym BEA Systems. W WebLogic Workshop można definiować specjalnie sformatowane komentarze, które pozwalają parserom wygenerować odpowiedni kod.

Metadane w J2SE 1.5 sprawią, że tego typu operacje będą wykonywane w sposób naturalny i elegancki. Co więcej, programista samodzielnie może definiować "typy opisowe" służące do tworzenia metadanych.

Wprowadzono (zgodnie z JSR-166) zestaw wysokopoziomowych mechanizmów upraszczających tworzenie aplikacji wielowątkowych, w tym implementację semaforów binarnych, bezpiecznych kolejek wielowątkowych itp. To duży postęp, jako że do tej pory programista był skazany na wykorzystywanie mechanizmów niskiego poziomu lub alternatywnie, na samodzielną implementację metod synchronizacyjnych w wielowątkowości.

Ułatwieniem dla programistów jest również fakt, że klasy pośrednie dla wywołań RMI mogą być w JDK 1.5 generowane dynamicznie. Praktycznie znika konieczność stosowania w tym celu specjalnego kompilatora, który generował odpowiednie struktury.

Z typu do typu

Jedną z najważniejszych nowości J2SE 1.5 jest możliwość stosowania w języku Java tzw. typów ogólnych (generic types). Miały się one pojawić już w J2SE 1.4, jednak w ostatniej chwili Sun stwierdził, że potrzebuje więcej czasu na przygotowanie zmian.

Typy ogólne pozwalają stworzyć uniwersalną klasę, którą można sparametryzować innym typem. Koncepcyjnie przypominają szablony znane z C++, ale działają nieco inaczej.

W Javie będzie można zdefiniować typy parametryzowane - takie, których definicja powstaje na podstawie schematu sparametryzowanego innym typem. Dobrym przykładem są tu tzw. kolekcje (collections).

Dzięki temu podczas kompilacji jest możliwe sprawdzenie poprawności kodu i nie jest konieczne zbyt częste stosowanie typu ogólnego.

W nowej wersji J2SE elegancko rozwiązano kwestię konwersji typów prostych - primitive types (int, boolean itd.) - na odpowiadające im typy obiektowe (Integer, Boolean itd.), i odwrotnie. W niemal każdym języku obiektowym występuje pewna "niespójność". Z jednej strony, każdy element jest obiektem - czyli ma zestaw cech, które go charakteryzują. Jednocześnie jednak istnieje wiele elementów, tzw. typów prostych, które z powodów wydajnościowych nie są obiektami. Problem polega na tym, że czasami trzeba elegancko "przejść" pomiędzy typem prostym a obiektem, który temu typowi odpowiada.

Dotychczas w Javie trzeba było tworzyć ręcznie instancję klasy typu Integer, przekazując konstruktorowi parametr - liczbę typu int (typ prosty). W J2SE 1.5 dzięki mechanizmowi autoboxing takie konwersje są wykonywane automatycznie. W zależności od potrzeb te same zmienne można więc traktować jako proste, a innym razem jako obiektowe. Oczywiście, istnieją pewne ograniczenia domyślnej konwersji, np. typu null nie można konwertować do żadnego typu prostego albo też, że obiektu typu class nie można konwertować do typu table, chyba że klasa jest jednocześnie obiektem.

Oprócz tego w Javie 1.5 wprowadzono typy wyliczeniowe i określono zasady porównywania ich ze stałymi. Można też stosować funkcje ze zmienną liczbą parametrów, a także znaną z C składnię formatowania znaków wyprowadzanych do/z strumieni.


TOP 200