Java 8 jest najnowszą wersją języka programowania Java. Poprzednia wersja, Java 7, także była znaczącą modyfikacją, jednak zawierała głównie rozwinięcie zmian wprowadzonych we wcześniejszych wersjach. A zatem od poprzedniego wydania tej książki w Javie zmieniło się naprawdę dużo! Te cechy i rozwiązania, które w wersji Java 5 były nowościami, takie jak adnotacje, typy ogólne, mechanizmy współbieżności itd., teraz są powszechnie znane i stosowane. Nowe interfejsy programistyczne, obejmujące całe spektrum zastosowań Javy, pojawiały się i znikały. Można tu wspomnieć o wersji Java ME, która obecnie, gdy firma BlackBerry przestała jej używać, jest już praktycznie martwa, JSF, który (powoli) zastępuje JSP, choć głównie w niektórych korporacyjnych zastosowaniach, czy też o Spring Framework, który stopniowo zyskuje coraz większą popularność. Wiele osób uważa, że czasy, kiedy Java była używana do pisania aplikacji na komputery stacjonarne, dawno już minęły albo nawet że cały „język Java umiera”; jednak zdecydowanie nic takiego nie ma miejsca — Swing, JavaFX, Java EE oraz system Android (bez względu na pozew wytoczony przez firmę Oracle) sprawiają, że Java ma się doskonale. Oprócz tego ponowny wzrost zainteresowania językami skryptowymi korzystającymi z wirtualnej maszyny Javy, takimi jak Groovy, JRuby, Jython, Scala oraz Clojure, zapewniają platformie Javy jedno z pierwszych miejsc wśród najpopularniejszych języków programowania na świecie.
Największymi wyzwaniami, jakim musiałem stawić czoła podczas przygotowywania trzeciego wydania tej książki, była konieczność ograniczenia prezentowanych w niej API, powstrzymanie własnej ekscytacji i zachowanie trzeźwego spojrzenia, jak również zadbanie o to, by książka nie przekroczyła wielkości przewidzianej przez wydawnictwo O’Reilly dla serii wydawniczej Cookbook oraz poprzedniego wydania. Niniejsza książka nie mogła mieć więcej niż 900 stron, a bez wątpienia przekroczyłaby tę granicę, gdybym chciał przedstawić w niej wszystkie fascynujące nowości.
Z książki usunąłem także informacje o niektórych interfejsach programistycznych, które były prezentowane w poprzednim wydaniu. Przede wszystkim dotyczy to rozdziału poświęconego obsłudze portów równoległych i szeregowych (który został zredukowany do jednej receptury w Rozdział 10.); komputery nie są już przeważnie wyposażone w te porty i niemal nikt ich nie używa — obecnie cała uwaga koncentruje się na porcie USB, a jak na razie nie ma jednego standardowego API przeznaczonego do jego obsługi w języku Java (i szczerze mówiąc, niewielu programistów interesuje się tym zagadnieniem).
Jeśli nie znasz zbyt dobrze Javy, to doskonale się składa. Jeśli wiesz o tym języku troszkę więcej, to jeszcze lepiej! Ta książka doskonale się nadaje dla wszystkich osób, które trochę znają Javę i chciałyby dowiedzieć się o tym języku jeszcze czegoś. Jeśli natomiast Czytelnik nie miał jeszcze żadnego kontaktu z tym językiem, to w pierwszej kolejności powinien sięgnąć po jedną z książek dla początkujących, takich jak: Java. Rusz głową! Wydanie II (wydawnictwo Helion, http://helion.pl/ksiazki/java-rusz-glowa-wydanie-ii-kathy-sierra-bert-bates,javrg2.htm), Java. Wprowadzenie (wydawnictwo Helion, http://helion.pl/ksiazki/java-wprowadzenie-patrick-niemeyer-jonathan-knudsen,jawpro.htm) bądź też po książkę Java in a Nutshell (wydawnictwo O’Reilly, http://shop.oreilly.com/product/9780596007737.do), jeśli Czytelnik jest doświadczonym programistą języka C.
W roku 1980, w czasie pracy na Uniwersytecie Toronto, rozpocząłem pisanie programów w języku C. Język ten służył mi całkiem dobrze w latach 80. i na początku lat 90. W roku 1995, gdy powstający właśnie język Oak został przemianowany na Javę, miałem to szczęście, że mój kolega, J. Greg Davidson, zwrócił na niego moją uwagę. Wysłałem wiadomość pocztą elektroniczną na podany przez Grega adres i otrzymałem następującą odpowiedź:
| Hi. A friend told me about WebRunner(?), your extensible network | browser. It and Oak(?) its extension language, sounded neat. Can | you please tell me if it's available for play yet, and/or if any | papers on it are available for FTP? Check out http://java.sun.com (oak got renamed to java and webrunner got renamed to hotjava to keep the lawyers happy)
A zatem Oak stał się Javą[1], jeszcze zanim miałem okazję go przetestować. Skopiowałem więc przeglądarkę HotJava i zacząłem się nią bawić. Na początku nie byłem przekonany do tego nowomodnego języka, przypominającego nieco okrojone C i C++. Napisałem kilka programów testowych i demonstracyjnych, zapisując je wszystkie w jednym katalogu o nazwie javasrc, aby nie pomieszały się z kodami źródłowymi programów w C (ponieważ często zdarzało się, że programy stworzone w obu tych językach miały takie same nazwy). Kiedy poznałem Javę nieco lepiej, zacząłem zauważać jej zalety związane z takimi zagadnieniami jak automatyczne odzyskiwanie pamięci czy też możliwość uniknięcia przeprowadzania obliczeń na wskaźnikach. Zawartość katalogu javasrc wciąż rosła. Napisałem kurs języka Java dla firmy Learning Tree[2], a zawartość mojego katalogu zaczęła rosnąć jeszcze szybciej, aż w końcu osiągnęła stan, w którym konieczne było stworzenie podkatalogów. Nawet pomimo rozbudowy struktury katalogów coraz trudniej mi było odnajdywać stworzone klasy i programy, aż wkrótce zrozumiałem, że przydałoby się stworzenie jakiejś dokumentacji.
W pewnym sensie niniejsza książka jest wynikiem potężnej kolizji pomiędzy moim katalogiem javasrc a zapisem dokumentacyjnym wprowadzonym na potrzeby innego nowego języka. Autorzy książki Perl. Receptury (Perl Cookbook) — Tom Christiansen oraz Nathan Torkington — wypracowali bardzo udane rozwiązanie, polegające na przedstawianiu omawianych zagadnień w niewielkich artykułach dotyczących ściśle określonego tematu. Oryginalnym wzorem książek tego typu są oczywiście doskonale znane książki kucharskie (ang. cookbook). Historia wykorzystania tego terminu w odniesieniu do serii receptur typu „jak to zrobić” związanych z tematyką informatyczną jest dosyć długa. W przypadku zagadnień związanych z programowaniem Donald Knuth wykorzystał podobne rozwiązanie w swojej książce The Art of Computer Programming wydanej po raz pierwszy w roku 1968 przez wydawnictwo Addison-Wesley. Z kolei w przypadku zagadnień związanych ze sprzętem należy wymienić książkę Dona Lancastera The TTL Cookbook wydaną przez wydawnictwo Sams. (Układy logiczne tranzystorowo-tranzystorowe, nazywane także układami TTL, były w tamtych czasach elementami, z których budowano bardziej złożone konstrukcje). Tom oraz Nathan stworzyli bardzo udaną wariację tego sposobu prezentowania informacji i szczerze polecam ich książkę wszystkim osobom, które — jak to ujęli autorzy — „chciałyby nieco lepiej poznać Perla”. Niniejsza książka jest w rzeczywistości przeznaczona dla osób, które „chciałyby nieco lepiej poznać Javę”.
Kody przedstawione w poszczególnych recepturach są z założenia całkowicie niezależne. Bez żadnych ograniczeń możesz wykorzystywać dowolne ich fragmenty we własnych projektach.
Zakładam, że Czytelnik dysponuje znajomością podstaw języka Java. Nie będę w niej opisywał, jak wyświetlić łańcuch znaków i liczbę całkowitą przy użyciu jednego wywołania metody println
ani jak stworzyć klasę potomną klasy JFrame
i wyświetlić własne imię w okienku. Przyjmuję, że Czytelnik przeszedł kurs Javy lub przeczytał jakąś książkę na temat tego języka przeznaczoną dla początkujących, na przykład Java. Rusz Głową! Wydanie II lub Java in a Nutshell. Niemniej jednak w Rozdział 1. zostały omówione pewne techniki, które mogą nie być Czytelnikowi znane, a są konieczne do zrozumienia zagadnień omawianych w dalszej części. Informacje te można pominąć! W tekście książki umieszczono wiele odwołań do innych jej fragmentów związanych z omawianymi zagadnieniami.
W odróżnieniu od Toma i Nathana, którzy napisali książkę o Perlu, nie muszę poświęcać wiele uwagi osobliwościom i idiomom używanego języka — w Javie próżno by szukać różnych dziwnych sztuczek[3]. Nie oznacza to jednak, że dobre poznanie tego języka jest zadaniem trywialnym! W takim przypadku pisanie niniejszej książki byłoby bezcelowe. A zatem moim podstawowym celem jest skoncentrowanie uwagi na interfejsach programistycznych Javy — w przedstawionych przykładach pokażę, jakie interfejsy programistyczne są dostępne oraz do czego najlepiej je stosować.
Podobnie jak Perl, także i Java jest językiem, który rozwija się wraz z programistą i z czasem zachwyca go coraz bardziej. Muszę wyznać, że aktualnie niemal wyłącznie używam właśnie Javy. Programy, które niegdyś tworzyłem w C — za wyjątkiem sterowników oraz programów napisanych przed laty — teraz piszę w Javie.
Jednak Java jest przeznaczona do rozwiązywania zupełnie innych problemów niż Perl. Perl (oraz inne języki skryptowe, takie jak awk bądź Python) doskonale nadaje się do tworzenia krótkich, „jednowierszowych” programów narzędziowych. Jak pokazują Tom i Nathan, Perl wspaniale nadaje się do takich rozwiązań jak na przykład wyświetlenie 42. wiersza pliku tekstowego. Oczywiście podobne programy można także pisać w Javie, jednak ze względu na to, iż jest to obiektowo zorientowany język wymagający kompilacji, znacznie lepiej nadaje się on do „poważnego programowania” bądź tworzenia aplikacji korporacyjnych. Faktycznie, znaczna część rozwiązań wprowadzonych w Javie 2 była przeznaczona do wykorzystania w aplikacjach tego typu. Niemniej wiele technik przedstawię z konieczności w uproszczonej postaci bądź nawet w formie fragmentów kodu. Każdy wiersz kodu przedstawionego w tej książce został skompilowany i uruchomiony. Naprawdę!
Wiele dłuższych przykładów zaprezentowanych w tej książce to narzędzia, które początkowo stworzyłem w celu automatyzacji wykonywania żmudnych, codziennych czynności. Na przykład program MkIndex
(dostępny aktualnie w repozytorium javasrc) odczytuje zawartość głównego katalogu, w którym przechowuje kody źródłowe przykładowych programów, i na tej podstawie tworzy plik index.html, który można wyświetlić w przeglądarce. Kolejnym przykładem może być pierwsze wydanie niniejszej książki, którego fragmenty zostały zapisane w XML-u (patrz Rozdział 20.). Używałem w nim XML-a zarówno do wpisania, jak i oznaczenia oryginalnego tekstu niektórych jej rozdziałów. Tekst ten został następnie przekształcony do postaci akceptowanej przez program używany do składania tekstu z wykorzystaniem programu XmlForm
. Program ten obsługuje także wstawianie do tekstu całych kodów oraz ich części z katalogu źródłowego za pomocą kolejnego programu — GetMark
. Program XmlForm
został omówiony w Rozdział 20.
Przyjrzyjmy się teraz organizacji książki. Rozpoczyna ją Rozdział 1, w którym opisałem niektóre sposoby kompilowania programów napisanych w Javie na różnych platformach systemowych, uruchamiania ich w różnych środowiskach (przeglądarkach, z poziomu wiersza poleceń oraz w systemach operacyjnych z graficznym interfejsem użytkownika) oraz testowania.
W Rozdział 2, odszedłem od problematyki kompilacji oraz uruchamiania i skoncentrowałem się na przystosowaniu programu do otoczenia, w jakim działa, czyli innych programów wykonywanych na tym samym komputerze.
W kilku kolejnych rozdziałach przedstawiam podstawowe interfejsy programistyczne Javy. W Rozdział 3., „Łańcuchy znaków i przetwarzanie tekstów”, skoncentrowałem się na jednym z podstawowych, a jednocześnie bardzo potężnym typie danych. Pokazałem w nim, jak można łączyć, dzielić, porównywać oraz modyfikować dane, które w innych przypadkach można by uznać za zwyczajny tekst.
W Rozdział 4, przedstawiłem, w jaki sposób można korzystać z niezwykle potężnej technologii wyrażeń regularnych i za jej pomocą rozwiązywać wiele zagadnień związanych z dopasowywaniem łańcuchów znaków i porównywaniem wzorców. Przetwarzanie wyrażeń regularnych jest już od wielu lat standardową możliwością języka Java, jednak ktoś, kto jej nie zna, możne „na nowo wymyślać koło”.
W Rozdział 5, opisałem zarówno wbudowane typy danych, takie jak int
oraz double
, jak również odpowiadające im klasy interfejsu programistycznego Javy (Integer
, Double
i tak dalej) oraz sposoby konwersji i narzędzia pomocnicze udostępniane przez te klasy. Wspomniałem też krótko o klasach operujących na „dużych liczbach”. Ponieważ programiści używający Javy bardzo często muszą operować na datach i czasie, i to zarówno w sposób „lokalny”, jak i „międzynarodowy”, dlatego w Rozdział 6, poruszyłem te ważkie zagadnienia.
Kolejne dwa rozdziały są związane z przetwarzaniem danych. Tablice w Javie, podobnie jak w większości innych języków programowania, są liniowymi, indeksowanymi kolekcjami danych o podobnej postaci. Tablice opisałem w Rozdział 7. W rozdziale tym przedstawiłem także klasy „kolekcji” należące do pakietu java.util
, które dają potężne możliwości przechowywania znacznych ilości obiektów, jak również zastosowania „typów ogólnych”.
Niezależnie od syntaktycznego podobieństwa do niektórych języków strukturalnych, takich jak C, Java jest językiem o wybitnie obiektowym charakterze. W Rozdział 8, opisuję wybrane, kluczowe zagadnienia programowania obiektowego w języku Java, takie jak przesłanianie metod klasy java.lang.Object
oraz znaczenie wykorzystania wzorców projektowych.
Java nie jest i nigdy nie będzie językiem „funkcjonalnym”. Można w niej jednak korzystać z niektórych technik programowania funkcyjnego, a w wersji Java 8, dzięki dodaniu „wyrażeń lambda” (nazywanych także „domknięciami”), możliwości te zostały znacznie powiększone. Zagadnienia te opisałem w Rozdział 9.
W kilku kolejnych rozdziałach zająłem się różnymi aspektami tradycyjnych operacji wejścia-wyjścia. W Rozdział 10, szczegółowo opisałem zasady związane z odczytywaniem i zapisywaniem plików. (Tego rozdziału nie należy pomijać, wychodząc z założenia, że operacje na plikach są nudne. Zawarte w nim informacje będą bowiem potrzebne w kolejnych rozdziałach, jak na przykład w Rozdział 13, w którym opisałem odczyt i zapis danych w portach szeregowych i równoległych oraz zagadnienia komunikacji sieciowej bazującej na wykorzystaniu gniazd). W Rozdział 11, przedstawiłem wszelkie dodatkowe operacje na plikach (takie jak określanie ich wielkości i czasu ostatniej modyfikacji), czynności związane z odczytem zawartości i modyfikacją katalogów, tworzeniem plików tymczasowych i zmienianiem nazw plików.
Rozdział 12, poświęciłem zagadnieniom tworzenia graficznego interfejsu użytkownika. Zamieściłem w nim zarówno informacje bardzo szczegółowe, takie jak wyświetlanie grafiki bądź określanie używanych czcionek i kolorów, jak i opisy czynności „wysokiego poziomu”, takich jak sterowanie odtwarzaniem klipu wideo lub filmów. W Rozdział 14, przedstawiłem kolejne zagadnienia „wyższego poziomu” związane z tworzeniem graficznego interfejsu użytkownika i wykorzystaniem predefiniowanych komponentów, takich jak przyciski, etykiety, listy i tak dalej. Po poznaniu graficznego interfejsu użytkownika (lecz przed rozpoczęciem jego tworzenia) warto przeczytać Rozdział 15, dzięki któremu tworzone programy będą mogły z równym powodzeniem działać w Afganistanie, Amsterdamie i Anglii, jak dziś działają w Albercie, Arkansas oraz Alabamie...
Java była początkowo rozpowszechniana jako „język programowania dla internetu”, dlatego też uczciwość wymaga, aby poświęcić nieco czasu na omówienie wykorzystania Javy w zagadnieniach sieciowych. W Rozdział 13, zamieściłem podstawowe informacje o tworzeniu programów sieciowych z punktu widzenia „klientów”, koncentrując się na wykorzystaniu gniazd. W tym wydaniu książki w Rozdział 13. nie opisuję już apletów i klientów WWW, koncentruję się natomiast na klientach korzystających z usług sieciowych. Obecnie tak wiele aplikacji musi używać takich usług, a zwłaszcza usług tworzonych w oparciu o architekturę REST, że przedstawienie tych zagadnień uznałem za konieczność. Z kolei zagadnienia związane z tworzeniem serwerów sieciowych opisałem w Rozdział 16.
Programy internetowe bardzo często muszą także generować pocztę elektroniczną, dlatego też tę część książki kończy Rozdział 17.
W Rozdział 18, opisałem mechanizmy wysokiego poziomu zapewniające dostęp do baz danych (JPA oraz Hibernate), jak również pakiet niskiego poziomu — Java Database Connectivity (JDBC); pokazałem w nim, jak można nawiązywać połączenia z lokalnymi i zdalnymi relacyjnymi bazami danych, zapisywać i pobierać informacje oraz jak zdobywać informacje o wynikach zapytań i o samej bazie danych.
JSON (ang. JavaScript Object Notation) jest prostym, tekstowym formatem wymiany danych. W Rozdział 19, opisuję ten format oraz kilka spośród wielu dostępnych interfejsów programistycznych pozwalających na korzystanie z niego.
Innym sposobem przechowywania i wymiany informacji jest język XML. W Rozdział 20, przedstawiłem formaty XML oraz niektóre spośród operacji, jakie można wykonywać przy użyciu dwóch standardowych interfejsów programistycznych Javy — SAX oraz DOM.
W Rozdział 21, pokazałem, w jaki sposób można tworzyć pakiety, w skład których wchodzą współpracujące ze sobą klasy. W rozdziale tym poświęciłem także nieco uwagi zagadnieniom „wdrażania” bądź rozpowszechniania i instalowania własnych programów.
W kolejnym, Rozdział 22, opisałem, jak tworzyć klasy, które sprawiają wrażenie, jak gdyby jednocześnie wykonywały kilka różnych czynności, oraz pozwalają na wykorzystanie możliwości komputerów wyposażonych w większą liczbę procesorów.
W Rozdział 23., „Introspekcja lub »klasa o nazwie Class«”, opisałem tak tajemnicze i sekretne zagadnienia jak sposób automatycznego tworzenia dokumentacji interfejsu programistycznego (dzięki któremu w wolnym czasie można się stać sławnym autorem książek o Javie), a także sposób, w jaki przeglądarki mogą pobierać i wykonywać dowolne aplety, pomimo że nigdy nie „spotkały się” z daną klasą.
Czasami zdarza się, że dysponujemy już stworzonym i działającym kodem napisanym w innym języku lub chcielibyśmy wykorzystać Javę jako element większego pakietu. W Rozdział 24, pokazałem, jak można uruchomić zewnętrzny program (dostępny w formie skryptu lub skompilowanego programu) oraz jak prowadzić bezpośrednią interakcję z „kodem rodzimym” napisanym w językach C lub C++.
W jednej książce mającej 850 stron nie da się niestety napisać na temat Javy wszystkiego, co chciałbym przekazać. Posłowie zawiera kilka podsumowujących uwag oraz adres prowadzonej przeze mnie strony poświęconej interfejsom programistycznym Javy, które każdy programista używający tego języka powinien znać.
I w końcu, w Dodatek B zamieściłem skróconą historię poszczególnych wersji Javy; a zatem niezależnie od tego, której wersji języka Czytelnik się uczył, może zajrzeć tutaj i uaktualnić swoją wiedzę.
Zapewne nie ma na świecie dwóch programistów lub pisarzy, którzy byliby w stanie dojść do porozumienia odnośnie do najlepszej kolejności, w jakiej należałoby opisywać wszystkie zagadnienia związane z Javą. Aby ułatwić czytelnikom korzystanie z niniejszej książki, w jej tekście umieściłem wiele odnośników wykorzystujących głównie numery receptur.
Pojawiło się wiele znaczących aktualizacji języka Java — informacje o ich historii można przeczytać w Dodatek B. Niniejsza książka koncentruje się na wersjach 7 oraz 8 platformy języka Java. Przypuszczam, że kiedy książka trafi do rąk Czytelników, wszystkie istotne projekty będą realizowane przy użyciu języka Java 6 lub 7 i jedynie niewielka liczba maruderów będzie jeszcze korzystać z wcześniejszych wersji (i to głównie z powodów historycznych — warto zauważyć, że już na rok przed publikacją tej książki wersja Java 6 języka przestała być wspierana). Kody prezentowane w tej książce, zamieszczone w repozytorium javasrc, skompilowałem na kilku różnych platformach systemowych oraz wersjach Javy, aby zagwarantować ich przenaszalność.
Java API składa się z dwóch podstawowych części: podstawowego API oraz dodatkowych API. Tą pierwszą, z definicji, jest interfejs programistyczny dołączany do JDK, który można bezpłatnie pobrać z witryny firmy Oracle http://java.com/. Wszystkie pozostałe interfejsy programistyczne są uważane za dodatkowe. Jednak nawet ten podstawowy interfejs programistyczny nie jest wcale mały: tworzy go około 50 pakietów, w skład których wchodzi więcej niż 3000 klas, z których każda ma średnio kilkanaście metod publicznych. Programy korzystające z tego API dają bardzo dużą gwarancję przenaszalności i możliwości uruchamiania na wszystkich głównych platformach systemowych, na których jest dostępny język Java.
Z kolei dodatkowy interfejs programistyczny można dalej podzielić na rozszerzenia standardowe oraz niestandardowe. Trzeba jednak pamiętać, że nie wszystkie pakiety, których nazwy rozpoczynają się od słowa javax
, są rozszerzeniami; na przykład pakiet javax.swing
oraz wszystkie jego pakiety podrzędne kiedyś był jedynie dodatkiem, a teraz wchodzi w skład podstawowego API. Firmy posiadające licencje na tworzenie własnych implementacji Javy (takie jak Apple oraz IBM) nie muszą implementować wszystkich standardowych rozszerzeń, jeśli jednak to robią, to powinny zachować ich interfejs. W tej książce będę wyraźnie zwracał uwagę na wszystkie przykłady, które wymagają zastosowania standardowych rozszerzeń. Niewielka grupa przykładów wymaga także użycia rozszerzeń niestandardowych, innych niż klasy prezentowane w książce. Mój własny pakiet, com.darwinsys
, zawiera klasy pomocnicze stosowane w niektórych przykładach; we wszystkich klasach, które z niego korzystają, na samym początku pliku będzie umieszczona odpowiednia instrukcja import
.
Oprócz tego istnieją także dwie inne, standaryzowane platformy języka Java: Java ME oraz Java EE. Java Micro Edition (Java ME) jest przeznaczona na niewielkie urządzenia, takie jak komputery podręczne, telefony komórkowe, faksy i tak dalej. Platforma ta udostępnia różne „profile” dla różnych klas urządzeń. Na drugim końcu spektrum znajduje się platforma Java Enterprise Edition (Java EE), przeznaczona do tworzenia bardzo dużych, skalowalnych i rozproszonych aplikacji. W jej skład wchodzą takie interfejsy programistyczne jak: serwlety, JavaServer Pages, JavaServer Faces, CORBA, RMI, JavaMail, komponenty Enterprise JavaBeans (EJB) czy transakcje. Nazwy pakietów należących do Java ME oraz Java EE rozpoczynają się od „javax”, gdyż nie zaliczają się do pakietów standardowych. W tej książce w ogóle nie będę się nimi zajmował, choć używam w niej kilku pakietów „korporacyjnych”, które mogą się przydać przy pisaniu normalnych aplikacji; przykładem może być pakiet JavaMail do obsługi poczty elektronicznej. Jak już wspominałem, serwlety oraz technologia JSP, opisywane w poprzednim wydaniu książki, zostały usunięte, gdyż dostępna jest nowa książka pt. Java Servlet and JSP Cookbook (http://shop.oreilly.com/product/9780596005726.do).
Wspomniałem wcześniej o telefonach komórkowych oraz urządzeniach mobilnych. Jak sądzę, Czytelnik wie, że oprogramowanie dla systemu Android jest pisane w Javie. Pocieszające jest to, że Android używa większości standardowych interfejsów programistycznych, za wyjątkiem pakietów Swing oraz AWT, które zostały zastąpione innymi rozwiązaniami. Programiści Javy zainteresowani tematyką pisania aplikacji dla systemu Android mogą sięgnąć po książkę Android. Receptury (Helion 2013).
W niniejszej książce zamieściłem wiele przydatnych informacji. Jednak ze względu na ilość poruszanych zagadnień nie byłem w stanie zapewnić długich i wyczerpujących opisów każdego z nich. Dlatego też w tekście można znaleźć wiele odwołań do witryn WWW oraz innych książek. To próba utrzymania kontaktu z moimi docelowymi odbiorcami — osobami, które chcą trochę lepiej poznać język Java.
Wydawnictwo O’Reilly & Associates wydaje jedną z największych i według mnie najlepszych obecnie na rynku kolekcji książek poświęconych językowi Java. Wraz z rozwojem interfejsu programistycznego języka poszerzany jest także zakres tematyczny oferowanych publikacji. Informacje na temat tych książek można znaleźć w witrynie http://java.oreilly.com/, pozycje te można także zamówić przez internet. Książki te można również czytać za pośrednictwem internetu, korzystając ze specjalnej, płatnej usługi subskrypcyjnej (patrz http://safari.oreilly.com/). Oczywiście, większość tych książek jest obecnie dostępna w formie elektronicznej. W odróżnieniu od niektórych innych wydawców elektroniczne publikacje firmy O’Reilly są pozbawione zabezpieczeń DRM, dzięki czemu nie trzeba się obawiać, że zastosowany schemat zabezpieczeń uniemożliwi korzystanie z nich na konkretnym urządzeniu lub systemie. Choć w niniejszej książce zamieściłem odwołania do wielu innych książek, to jednak jest wśród nich kilka pozycji, którym należy poświęcić szczególną uwagę.
Pierwszą z nich i najważniejszą jest książka Davida Flanagana, Java in a Nutshell (http://shop.oreilly.com/product/9780596007737.do), zawierająca krótki opis języka i jego interfejsu programistycznego oraz bardziej wyczerpujące informacje na temat najważniejszych pakietów. Książka ta doskonale nadaje się do tego, aby trzymać ją tuż obok komputera. Książka Java. Rusz głową! Wydanie II (Helion, http://helion.pl/ksiazki/java-rusz-glowa-wydanie-ii-kathy-sierra-bert-bates,javrg2.htm) stanowi nieco dziwaczne i zabawne wprowadzenie do języka Java i można ją polecić mniej zaawansowanym czytelnikom.
Kolejną książką jest Java Swing (http://shop.oreilly.com/product/9780596004088.do) autorstwa Roberta Ecksteina, Marca Loya, Dave’a Wooda, Jamesa Elliotta oraz Briana Cole’a, zawierająca doskonały (i monumentalny) opis tworzenia graficznego interfejsu użytkownika przy użyciu pakietu Swing.
Java Virtual Machine (O’Reilly, http://shop.oreilly.com/product/9781565921948.do) napisana przez Jona Meyera oraz Troya Downinga bez wątpienia zaintryguje wszystkich, którzy chcą poznać tajniki działania Javy. Książka ta nie jest już dostępna w sprzedaży, jednak można ją znaleźć w bibliotekach lub kupić używany egzemplarz.
Cennym źródłem informacji są także prace Elliotte’a Rusty’ego Harolda: Java Network Programming (http://shop.oreilly.com/product/0636920028420.do) oraz Java I/O (http://shop.oreilly.com/product/9780596527501.do).
Osoby zainteresowane tematyką obsługi baz danych mogą skorzystać z książek: Database Programming with JDBC and Java (http://shop.oreilly.com/product/9781565926165.do), której autorem jest George Reese, oraz Pro JPA 2: Mastering the Java Persistence API napisanej przez Mike’a Keitha oraz Merricka Schincariola (Apress).
Choć w tej książce nie opisuję zagadnień związanych z korporacyjnymi zastosowaniami języka Java, to jednak chciałbym wspomnieć o dwóch książkach poświęconych tej tematyce:
Książka Java EE 7 Essentials (http://shop.oreilly.com/product/0636920030614.do) Aruna Gupty przedstawia najnowszą wersję Java EE.
Książka Real World Java EE Patterns: Rethinking Best Practices (http://www.amazon.com/Real-World-Patterns-Rethinking-Practices/dp/0557078326) Adama Biena zawiera przydatne informacje na temat projektowania i implementacji aplikacji korporacyjnych.
Dostępnych jest jednak znacznie więcej publikacji. Ich pełną listę można znaleźć w witrynie wydawnictwa O’Reilly (http://www.oreilly.com/).
Przed rozpoczęciem prac nad aplikacją z graficznym interfejsem użytkownika oraz przed jej udostępnieniem warto przeczytać oficjalną publikację firmy Sun: Java Look and Feel Design Guidelines (Addison-Wesley, http://www.oracle.com/technetwork/java/jlf-135985.html). Obejmuje ona prezentację czynników ludzkich oraz opinie ekspertów zatrudnionych w firmie Sun (przed jej przejęciem przez Oracle) i pracujących nad pakietem Swing od momentu jego opracowania. Zawarte w niej informacje wyjaśnią, jak należy tworzyć aplikacje tego typu.
I w końcu, choć to nie książka, to trzeba wspomnieć, że bardzo dużo informacji na temat języka Java jest dostępnych w witrynie firmy Oracle — https://docs.oracle.com/javase/8/docs/. Sporą część tej strony zajmuje diagram, który „konceptualnie” przedstawia wszystkie elementy języka Java. Jego wczesną wersję przedstawia Rysunek 1; każdy tekst umieszczony w prostokącie jest odnośnikiem do strony zawierającej szczegółowe informacje na temat konkretnej technologii. Warto zwrócić uwagę na bardzo użyteczny odnośnik Java SE API widoczny z prawej strony, który pozwala wyświetlić dokumentację standardowego interfejsu programistycznego Javy.
Książka Donalda E. Knutha The Art of Computer Programming już od momentu pojawienia się stanowiła źródło inspiracji dla studentów informatyki. Po raz pierwszy została wydana przez wydawnictwo Addison-Wesley w roku 1968. Jej pierwszy tom nosi tytuł Fundamental Algorithms, drugi — Seminumerical Algorithms, a trzeci — Sorting and Searching. Pozostałe cztery tomy, które miały wejść w skład projektowanej serii, nigdy nie zostały napisane do końca. Choć przykłady podawane przez Knutha nie mają nic wspólnego z językiem Java (na potrzeby swojej książki opracował on hipotetyczny języka assemblera), to jednak wiele uwag i informacji dotyczących algorytmów — czyli poprawnych metod wykorzystywania komputerów do rozwiązywania rzeczywistych problemów — jest równie aktualnych dziś, jak było 30 lat temu[4].
Książka The Elements of Programming Style napisana przez Briana W. Kernighana i P.J. Plaugera, zawierająca przykłady stworzone w wielu strukturalnych językach programowania, określiła styl pisania kodu (w dosłownym znaczeniu tego słowa) wielu generacji programistów. Kernighan napisał jeszcze (wraz z Plaugerem) dwie książki — Software Tools oraz Software Tools in Pascal — zawierają one tak wiele dobrych porad dotyczących programowania, że każdemu programiście polecam, by je przeczytał. Niemniej jednak te trzy książki są już nieco nieaktualne. Wiele razy chciałem napisać ich kontynuację, wykorzystując jeden z nowocześniejszych języków programowania, lecz zamiast tego zawsze odwoływałem się do książki The Practice of Programming napisanej przez Briana Kernighana oraz Roba Pike’a, będącej kontynuacją serii Software Tools. Książka ta podtrzymuje tradycje Bell Labs (Laboratoriów Bella, aktualnie należących do firmy Lucent) słynących z doskonałości publikowanych książek programistycznych. W „3.13. Przetwarzanie danych rozdzielonych przecinkami” wykorzystałem nawet jeden fragment kodu zamieszczonego w The Practice of Programming.
Dodatkowe informacje można znaleźć w książce The Pragmatic Programmer napisanej przez Adrew Hunta oraz Davida Thomasa (Addison-Wesley).
Książka Petera Coada Java Design, wydana przez wydawnictwo PTR-PH/Yourdon Press, opisuje zagadnienia analizy i projektowania obiektowego przedstawione pod kątem języka Java. Jej autor ma dość krytyczną opinię na temat implementacji paradygmatu „obserwowany-obserwator” wykorzystanego w Javie i udostępnia stworzone przez siebie rozwiązanie zastępcze.
Jedną z najsłynniejszych książek dotyczących projektowania obiektowego jest pozycja Design Patterns autorstwa Ericha Gammy, Richarda Helma, Ralpha Johnsona oraz Johna Vlissidesa (wydana przez wydawnictwo Addison-Wesley). Autorzy ci są czasami określani jako „brygada czwórki”, przez co o ich książce mówi się niekiedy jako o „książce GOF”[5]. Jeden z moich kolegów z uniwersytetu stwierdził, że „to najlepsza książka o projektowaniu obiektowym, jaka kiedykolwiek została napisana”, i w zupełności się z nim zgadzam; jeśli nie najlepsza, to przynajmniej należy do najlepszych.
Książka Refactoring Martina Fowlera przedstawia wiele sposobów „porządkowania kodu”, które pozwalają poprawić jego czytelność i ułatwić jego utrzymanie. O ile książka GOF wprowadziła nową terminologię ułatwiającą programistom (i nie tylko) prowadzenie dyskusji na temat projektowanego kodu, o tyle książka Fowlera dostarcza terminologii związanej z jego usprawnianiem. Ta książka może być jednak nieco mniej przydatna od pozostałych, gdyż obecnie narzędzia do refaktoryzacji są dostępne w większości zintegrowanych środowisk programistycznych, na przykład w Eclipse zostały one zgromadzone w menu Refactoring (patrz „1.3. Kompilacja, uruchamianie i testowanie programów przy użyciu IDE”).
Obecnie powszechnie wykorzystywane są dwie teorie związane z metodologią tworzenia kodu. Pierwsza z nich jest określana powszechnie jako „programowanie zwinne” (ang. Agile Development), a jego najbardziej znanymi reprezentantami są Scrum oraz eXtreme Programming (programowanie ekstremalne, określane w skrócie jako XP). XP (przy czym chodzi tu o metodologię programowania, a nie jedną z wersji systemu operacyjnego Microsoft Windows) została zaprezentowana przez swego twórcę, Kenta Becka, w serii krótkich, przyjemnych w lekturze artykułów.
Pierwszą z serii książek poświęconych programowaniu ekstremalnemu jest Extreme Programming Explained. Dobrą książką zawierającą ogólne informacje na temat programowania zwinnego jest Agile Software Development Ecosystems napisana przez Jima Highsmitha.
Kolejną grupę ważnych książek dotyczących projektowania obiektowego tworzy seria poświęcona językowi UML, napisana przez „trzech przyjaciół” — Grady’ego Boocha, Ivara Jacobsona oraz Jamesa Rumbaugha. Najważniejszymi książkami napisanymi przez tych autorów są: UML User Guide i UML Process, choć istnieją także i inne. Te same zagadnienia są omawiane w nieco mniej obszernej i łatwiejszej w odbiorze pracy UML Distilled napisanej przez Martina Fowlera.
W książce zostały wykorzystane następujące konwencje.
Pisząc tę książkę, zastosowałem następującą terminologię. Mianem programu określałem aplety, serwlety oraz aplikacje. Aplety są uruchamiane i wykonywane w przeglądarkach WWW. Serwlety przypominają nieco aplety, lecz są wykonywane przez serwer. Wszystkie pozostałe typy programów są określane jako aplikacje. Aplikacje biurowe (nazywane także „klienckimi” lub „klientami”) prowadzą interakcję z użytkownikami. Programy wykonywane na serwerze prowadzą bezpośrednią wymianę informacji z klientami, zazwyczaj z wykorzystaniem połączeń sieciowych (obecnie są one zazwyczaj realizowane przy użyciu protokołów HTTP bądź HTTPS).
Przykłady przedstawione w książce można podzielić na dwa rodzaje. Te zaczynające się od poleceń importu, komentarzy dokumentacyjnych oraz definicji klasy publicznej są pełnymi przykładami. Z kolei kody rozpoczynające się od deklaracji lub instrukcji są oczywiście jedynie fragmentami. Pełne wersje tych przykładów zostały skompilowane oraz uruchomione i są dostępne wraz z kodami źródłowymi wszystkich pozostałych przykładów przedstawionych w książce.
Numery receptur są tworzone przez numer rozdziału oraz numer kolejnej receptury w danym rozdziale; a zatem „8.5. Tworzenie metod zwrotnych z wykorzystaniem interfejsów” to piąta receptura przedstawiona w Rozdział 8.
W niniejszej książce zastosowałem następujące konwencje typograficzne:
jest stosowana do oznaczania poleceń, nazw plików oraz adresów URL. Służy także do oznaczania nowych terminów, które po raz pierwszy pojawiły się w tekście.
Czcionki o stałej szerokości znaków
używałem do prezentacji kodu — i to zarówno fragmentów, jak i pełnego kodu przykładów. Czcionką o stałej szerokości wyróżniane są także nazwy klas, metod i zmiennych oraz wszelkie inne fragmenty kodu.
Pogrubiona czcionka o stałej szerokości znaków
jest stosowana do prezentacji danych wpisywanych przez użytkownika, na przykład komend wpisywanych w wierszu poleceń.
Kursywa o stałej szerokości znaków
oznacza tekst, który powinien zostać zastąpiony wartościami podanymi przez użytkownika bądź też wartościami zależnymi od kontekstu.
⑧ Ta ikona, a właściwie prezentowana na niej cyfra, oznacza minimalną wersję języka Java wymaganą przez interfejs programistyczny opisywany w danej recepturze (nawet jeśli nie umieszczam w tekście stosownych ikon, to do skompilowania kodów może być niezbędna wersja Java 7). W ten sposób oznaczam wyłącznie receptury wymagające API dostępnych w wersjach 6, 7 i 8 języka Java; pozostałe powinny działać na wszystkich używanych aktualnie wersjach wirtualnej maszyny Javy. Nikt już nie powinien używać języka w wersji Java 5 (a tym bardziej wcześniejszych!), jak również nikt nie powinien tworzyć nowych aplikacji w Javie 6. Jeśli Czytelnik tak robi, to najwyższy czas sięgnąć po nowszą wersję Javy!
W wielu przypadkach oprócz kodów programów prezentuję także przykłady ich uruchomienia z poziomu wiersza oraz efekty wykonania. Będą one zazwyczaj prezentować znak zachęty: $
w systemie Unix lub >
w systemie Windows, zależnie od typu komputera, którego w danym dniu używałem. Tekst widoczny przed tym znakiem można zazwyczaj zignorować — może to być ścieżka dostępu lub nazwa komputera.
Zazwyczaj prezentowane przykłady będą także zawierać pełną nazwę pakietu, gdyż Java wymaga jej podczas uruchamiania programu z poziomu wiersza poleceń. Ma to ten dodatkowy efekt, że przypomina Czytelnikowi, w którym podkatalogu repozytorium z kodami znajduje się dany plik źródłowy.
Choć będziemy wdzięczni za podawanie źródła, to jednak tego nie wymagamy. Informacje te powinny zawierać autora, nazwę książki, wydawcę oraz numer ISBN, na przykład: Ian F. Darwin, Java. Receptury, Helion, ISBN: 978-83-246-9570-6.
Jeśli Czytelnik uważa, że planowany sposób wykorzystania kodów zamieszczonych w tej książce wykracza poza zakres dozwolonego użytku lub powyższego zezwolenia, to prosimy o kontakt: helion@helion.pl.
W posłowiu do pierwszego wydania tej książki napisałem, że „pisanie tej książki było pouczającym doświadczeniem”. Teraz powinienem dodać, że to samo dotyczy jej aktualizacji. Choć wielu recenzentów i pisarzy chwaliło moją pracę — jedna bardzo uprzejma osoba określiła tę książkę nawet jako „prawdopodobnie najlepszą książkę o programowaniu w Javie, jaka kiedykolwiek została napisana” — to jednak liczba błędów i przeoczeń w jej pierwszym wydaniu była doprawdy upokarzająca. Podczas prac nad tym wydaniem postanowiłem to poprawić.
Na moje życie wiele razy miał wpływ zbieg okoliczności — dzięki niemu spotykałem osoby, które pokazywały mi odpowiednie rzeczy we właściwym czasie. Steve Munroe, z którym już dawno temu straciłem kontakt, a który w roku 1970 pokazał mi komputery — w szczególności komputer IBM 360/30 pracujący w Toronto Board of Education, większy od pokoju, posiadający 32 lub 64 KB (a nie M ani G!) pamięci i moc obliczeniową zbliżoną zapewne do późniejszych komputerów PC/XT. Herb Kugel wziął mnie pod swoje skrzydła na Uniwersytecie Toronto, gdy poznawałem stworzone nieco później komputery mainframe firmy IBM. Wykładowcy Uniwersytetu Toronto — Terry Wood oraz Dennis Smith — przedstawili mi mini- oraz mikrokomputery, zanim jeszcze na rynku pojawiły się maszyny klasy IBM PC. Wieczory oraz weekendy spędzane w Toronto Business Club of Toastmasters International (http://www.toastmasters.org/) oraz Al. Lambert’s Canada SCUBA School pozwalały mi rozwijać swoje talenty oratorskie i instruktorskie. Kilka osób na Uniwersytecie Toronto nauczyło mnie doceniać zalety i wykorzystywać możliwości systemu operacyjnego Unix w chwili, gdy byłem gotów je poznać.
Pracownik USCD, Greg Davidson, prowadził pierwszy kurs Learning Tree, który przeszedłem, a następnie zaprosił mnie do pracy w charakterze instruktora w firmie Learning Tree. Wiele lat później, w czasie gdy Oak miał zostać opublikowany w witrynie firmy Sun, Greg zachęcił mnie, abym napisał do Jamesa Goslinga i dowiedział się czegoś więcej na temat tego nowego języka. Odpowiedź Jamesa, zacytowana na początku tego wstępu, informująca, że prawnicy zmusili twórców języka do zmiany jego nazwy na „Java” oraz że język ten „właśnie” został udostępniony, jest pierwszym niezwykle cennym „eksponatem” w mojej archiwalnej skrzynce pocztowej dotyczącej języka Java. Mike Rozek zlecił mi stworzenie na potrzeby Learning Tree kursu dotyczącego systemu operacyjnego Unix oraz dwóch kursów o języku Java. Po odejściu Marka z firmy kursami tymi zajmowali się kolejno Francesco Zamboni, Julane Marx oraz Jennifer Urick. Jennifer uzyskała także pozwolenie „ponownego wykorzystania” w niniejszej książce przykładów, które wcześniej przygotowałem na potrzeby opracowanych przeze mnie szkoleń. Dziękuję także instruktorom zatrudnionym w firmie Learning Tree oraz osobom uczęszczającym na prowadzone przez nią szkolenia za pokazanie mi sposobów usprawnienia moich prezentacji. Wciąż prowadzę kursy dla „The Tree” i polecam je wszystkim programistom, którzy chcieliby w ciągu czterech dni zdobyć szczegółowe informacje o wybranym zagadnieniu. Witrynę firmy Learning Tree można znaleźć pod adresem http://www.learningtree.com/.
Zbliżając się powoli do niniejszego projektu, Tim O’Reilly uwierzył w moją „niewielką książkę o programie Lint”, gdy była ona jeszcze jedynie przykładowym rozdziałem. Dzięki temu uzyskałem szansę szybkiego wejścia do grupy autorów wydawnictwa O’Reilly. Kilka lat później Mike Loukides zachęcił mnie do kontynuowania poszukiwań pomysłu na książkę poświęconą językowi Java, nad którą moglibyśmy wspólnie pracować. Mike wspierał mnie, gdy ostateczne terminy zaczynały się zbliżać, a praca nad książką wciąż nie była zakończona. To także Mike przeczytał cały rękopis niniejszej pozycji i podzielił się ze mną wieloma bardzo sensownymi uwagami i komentarzami, z których kilka sprowadziło moją wybujałą wyobraźnię na ziemię. Jessamyn Read przekształciła wiele moich wątpliwej jakości szkiców przesyłanych faksem i pocztą elektroniczną w wysokiej jakości rysunki i ilustracje, które można zobaczyć w niniejszej książce. Również wielu innych utalentowanych pracowników wydawnictwa O’Reilly pomagało w nadaniu tej pozycji jej ostatecznej postaci.
Jak zwykle ta książka nie mogłaby powstać, gdyby nie ogromna pomoc ze strony wielu pracowników wydawnictwa O’Reilly. Meghan Blanchette, Sarah Schneider, Adam Witwer, Melanie Yarbrough oraz wiele innych osób wymienionych na stronie z informacjami o prawach autorskich odegrało ważną rolę w przygotowaniu tej książki do wydania. Obecnie kody przykładów są dołączane do niej dynamicznie (dzięki czemu ich aktualizacja w tekście zajmuje znacznie mniej czasu), a nie wklejane ręcznie. Mój syn i jednocześnie programista używający języka Haskell, Benjamin Darwin, pomógł mi przygotować przykłady w wyznaczonym terminie i dostosować je do najnowszego mechanizmu „dołączania” kodu wykorzystywanego przez wydawnictwo O’Reilly, jak również w rozwiązaniu kilku problemów niezwiązanych bezpośrednio z Javą; oprócz tego pomógł mi poprawić czytelność informacji zamieszczonych w Rozdział 9. i nadać mu bardziej funkcyjny charakter. Recenzent książki, Alex Stangl, przeczytał całą książkę i znacznie przekroczył swoje obowiązki, przekazując mi niezliczoną ilość użytecznych sugestii, a nawet odnajdując błędy typograficzne, które zostały w tekście jeszcze po jej poprzednim wydaniu. Przydatne sugestie dotyczące wybranych fragmentów książki przekazali mi: Benjamin Darwin, Mark Finkov, Igor Savin oraz wiele innych osób: dziękuję Wam bardzo!
Chciałbym także podziękować wszystkim czytelnikom, którzy przesyłali informacje o błędach oraz pomysły na poprawienie tej książki. Dzięki zaangażowaniu osób takich jak Wy, które poświęcają czas na przesyłanie informacji o błędach wymagających poprawy, każde jej nowe wydanie jest lepsze od poprzedniego.
Chciałbym z całego serca podziękować wszystkim osobom, które po ukazaniu się pierwszego wydania tej książki przesłały mi swoje komentarze i opinie. W szczególności chciałbym wspomnieć o jednym z tłumaczy niemieckiego wydania książki[6] — Gisberth Selke podczas pracy nad jej wydaniem przeczytał ją od deski do deski, usprawniając i poprawiając tekst oryginału. Dokładnie to samo zrobił podczas prac nad drugim wydaniem książki, przesyłając mi dodatkowo wiele sugestii dotyczących możliwości poprawy kodów, dzięki którym książka stała się zdecydowanie lepsza. Znacznie wykraczając poza zakres swoich obowiązków, Gisberth nawet dodał jedną własną recepturę („24.5. Łączenie języków Java i Perl”) i poprawił kilka innych opublikowanych w tym samym rozdziale. Dziękuję Ci, Gisbercie! Drugie wydanie książki skorzystało także na komentarzach przesłanych przez Jima Burgessa, który przeczytał znaczną jej część. Komentarze dotyczące poszczególnych rozdziałów nadesłali mi także: Jonathan Fuerth, Kim Fowler, Marc Loy oraz Mike McCloskey. Również moja żona, Betty, oraz nastoletnie dzieci przeczytały w ramach kontroli po kilka rozdziałów.
Poniższe osoby nadesłały mi informacje o błędach w kodzie oraz sugestie poprawy przykładów zamieszczonych w pierwszym wydaniu książki: Rex Bosma, Rod Buchanan, John Chamberlain, Keith Goldman, Gilles-Philippe Gregoire, B.S. Hughes, Jeff Johnston, Rob Konigsberg, Tom Murtagh, Jonathan O’Connor, Mark Petrovic, Steve Reisman, Bruce X. Smith oraz Patrick Wohlwend. Dziękuję Wam wszystkim i przepraszam tych, o których zapomniałem wspomnieć.
Chciałbym także bardzo podziękować pracownikom wydawnictwa O’Reilly odpowiedzialnym za przeglądanie nadsyłanej korespondencji z pytaniami do książki. Dziękuję także Mike’owi Lukidesowi, Deb Cameron oraz Marlowowi Shaefferowi za prace związane z redakcją i produkcją drugiego wydania tej książki.
Muszę także podziękować recenzentom, a przede wszystkim mojej żonie, Betty Cerar, która być może wciąż myśli, że Java to rodzaj napoju zawierającego kofeinę, który piję podczas pisania programów; niemniej jednak jej dążenie do precyzyjnego i przejrzystego wysławiania się oraz stosowania poprawnych form gramatycznych miało wielki, pozytywny wpływ na pisane przeze mnie teksty. Jonathan Knudsen, Andy Oram oraz David Flanagan skomentowali projekt niniejszej książki, gdy zawierał on niewiele więcej niż jedynie listę tytułów rozdziałów i receptur. Byli oni jednak w stanie przewidzieć, jak książka może w przyszłości wyglądać oraz jak można by ją poprawić. Instruktor firmy Learning Tree, Jim Burgess, przeczytał większość niniejszej pracy, zwracając szczególną uwagę na zwroty, sposób formułowania myśli oraz kod programów. Bil Lewis oraz Mike Slinn (mslinn@ronsoft.com) podzielili się ze mną wieloma pomocnymi komentarzami dotyczącymi licznych wstępnych wersji niniejszej książki. Ron Hitchens (ron@ronsoft.com) oraz Marc Loy uważnie przeczytali jej finalną wstępną wersję. Redaktor Sue Miller pomogła przeprowadzić mój rękopis przez nieco nerwową, ostatnią fazę produkcji. Sarah Slocombe przeczytała cały rozdział dotyczący XML-a i podzieliła się ze mną wieloma błyskotliwymi sugestiami, choć, niestety, ze względu na czas nie byłem w stanie ich wszystkich wykorzystać. Wszystkie te osoby w różny sposób, lecz przede wszystkim podsuwając mi pomysły na nowe receptury oraz sposoby poprawienia istniejących, przyczyniły się do ulepszenia całości. Wszelkie usterki, jakie można znaleźć w książce, wynikają wyłącznie z mojej winy.
Żadna z książek poświęconych językowi Java nie byłaby kompletna bez poczwórnych podziękowań dla Jamesa Goslinga za wymyślenie pierwszej uniksowej wersji edytora Emacs, arkusza kalkulacyjnego sc, systemu zarządzania aplikacjami „okienkowymi” NeWS oraz Javy. Dziękuję także jego pracodawcy — firmie Sun Microsystems (NASDAQ SUNW) — za stworzenie nie tylko języka Java, lecz także ogromnej ilości różnego typu narzędzi oraz bibliotek zawierających interfejsy programistyczne, które można bezpłatnie skopiować przez internet.
Dziękuję także Tomowi oraz Nathanowi, autorom książki Perl Cookbook. Gdyby nie oni, prawdopodobnie nigdy bym nie opracował odpowiedniej formy dla mojej pracy.
Dostęp do wczesnych wersji systemu Mac OS X zawdzięczam Willowi Powellowi, pracownikowi firmy Apple Canada, później używałem już jednego bądź dwóch własnych netbooków firmy Apple. Dziękuję firmie Apple za to, że zdecydowała się oprzeć system Mac OS X na systemie BSD Unix, co sprawiło, że stała się ona największą na świecie komercyjną firmą używającą systemu uniksowego na komputerach biurowych (choć system Android firmy Google został zainstalowany na znacznie większej liczbie sprzedanych urządzeń, to jednak bazuje on na systemie Linux i nie liczy się w świecie komputerów biurowych).
Każdej z wymienionych osób serdecznie dziękuję.
Podczas przygotowywania, kompilowania i testowania przykładów przedstawionych w pierwszym wydaniu tej książki używałem wielu narzędzi i systemów operacyjnych. Programiści OpenBSD (http://www.openbsd.org/), „aktywnie bezpiecznego systemu operacyjnego bazującego na Uniksie”, zasługują na podziękowanie za stworzenie stabilnej i bezpiecznej wersji systemu Unix, która jest w większym stopniu zbliżona do jego oryginału niż jakikolwiek inny dostępny bezpłatnie system. Podczas wpisywania rękopisu książki w XML-u oraz w formacie dokumentów używanym przez pogram Adobe FrameMaker korzystałem z edytora vi (w systemie OpenBSD był to vi, a w systemie Windows vim). Każdy z nich jest doskonałym narzędziem, muszę tu jednak zamieścić ostrzeżenie związane z programem FrameMaker. Zanim zacząłem cykl przygotowań do nowego wydania tej książki, od momentu udostępnienia systemu Mac OS X minęły 4 lata. Tyle czasu miała firma Adobe na przygotowanie nowej wersji programu FrameMaker dostosowanej do nowego systemu operacyjnego. Zdecydowała się jednak tego nie robić, przez co zostałem zmuszony do wprowadzania wszystkich poprawek w coraz bardziej starożytnym, klasycznym środowisku. Zaskakujące, że w tym czasie sprzedaż programu FrameMaker na systemie Mac OS X ciągle spadała, aż w końcu, w czasie trwania ostatnich etapów przygotowywania drugiego wydania tej książki, firma Adobe oficjalnie ogłosiła, że nie będzie już kontynuować prac nad nowszymi wersjami tego doskonałego programu dla komputerów Macintosh. Sam nie wiem, czy będę w stanie wybaczyć Adobe zniszczenie czegoś, co mogło być najlepszym na świecie systemem dokumentacyjnym.
Z tego powodu książki Android Cookbook, która zawiera bardzo dużo przykładów, nie przygotowywałem już przy użyciu programu FrameMaker. Zamiast tego skorzystałem z formatu XML DocBook (generowanego na podstawie kodu w formacie Wiki, umieszczonego w witrynie przygotowanej specjalnie w tym celu) oraz zestawu narzędzi dostarczonych przez wydawnictwo O’Reilly.
Trzecie wydanie tej książki zostało napisane w formacie AsciiDoc (http://asciidoc.org/) z wykorzystaniem nowszego, szybszego systemu AsciiDoctor (http://asciidoctor.org/), a następnie powołane do życia przy użyciu aplikacji Atlas — interfejsu do obsługi publikacji firmy O’Reilly (https://atlas.oreilly.com/).
[1] Uwaga redakcyjna: „ten inny Oak”, który doprowadził do zmiany nazwy języka, nie był żadnym językiem programowania, jak się czasami uważa, lecz Oak Technology — firmą zajmującą się produkcją kart graficznych oraz twórcą pliku cdrom.sys, który w tamtym czasie był używany na każdym komputerze PC działającym pod kontrolą systemów DOS oraz Windows.
[2] Jednej z czołowych w świecie niezależnych firm prowadzących kursy, patrz http://www.learningtree.com/.
[3] No cóż, to nie do końca prawda, o czym można się przekonać, czytając książkę Java Puzzlers napisaną przez Joshuę Blocha oraz Neala Gaftera.
[4] Może za wyjątkiem algorytmów podejmowania decyzji, które stały się mniej aktualne ze względu na niezwykły wzrost mocy obliczeniowej komputerów.
[5] „GOF” to pierwsze litery angielskich słów „the gang of four” — „brygada czwórki”.
[6] Pierwsze wydanie tej książki jest obecnie dostępne w językach: angielskim, niemieckim, francuskim, polskim, rosyjskim, koreańskim, tradycyjnych chińskim i uproszczonym chińskim. Dziękuję bardzo wszystkim tłumaczom za wysiłek, jaki włożyli w udostępnienie tej książki szerszemu gronu odbiorców.