Java_exPress_007_2010_03.pdf

(12230 KB) Pobierz
759364129.294.png
Maszynista
JEP. gEt t Eam (). say t hank y ou ();
Już siódmy raz przyszło mi podzielić się z Wami tym, co dostaję
od innych. Myślałem, że po kilku numerach przyjdzie kryzys i nie
będzie chętnych do napisania artykułów. A jest zupełnie przeciw-
nie. Skłądając numer siódmy miałem materiały na cały numer
ósmy. Czy to nie cudownie? Gratulacje dla wszystkich, którzy
chcą w ten sposób podzielić się swoją wiedzą.
JAVA exPress z numeru na numer robi się coraz ciekawsze. Coraz więcej ludzi widzi sens
w publikowaniu swoich artykułów na łamach tego pisma. To dobrze. Wiedza, którą się
nie dzielimy z innymi jest mało warta.
Teraz pora na szerszą reklamę czasopisma. Nie chce mi się wierzyć, że w Polsce jest
tylko 2 tyś. developerów Java, którzy chcą rozwijać się i dokształcać. Pomóżcie w naszej
misji i prześlijcie na grupy dyskusyjne w pracy, czy na uczelni informacje o JAVA exPress.
Wielkie podziękowania należą się nie tylko autorom tekstów. JAVA exPress to zespół
ludzi, którzy mniej lub bardziej pomagają. Zaczynając od Marka Podsiadłego i Jakuba
Sosińskiego, którzy od samego początku pomagają tworzyć stronę JAVA exPress i samo
pismo. Cóż wiele tu mówić. Właściwie, to oni są odpowiedzialni za wszystko co widzicie
na stronach javaexpress.pl i dworld.pl. Tylko im zawdzięczamy, że mamy miejsce w sieci.
Podziękowania należą się także całej grupie tłumaczy oraz patronom. Od tego nume-
ru odszedł jeden patron, ale w zamian przyszedł nowy. Firma Adobe będzie wspierała
JAVA exPress przez co najmniej 1 rok. Mam nadzieję, że na tym się nie skończy, bo za-
częło się bardzo obiecująco.
Na koniec jak zwykle apel. Jeśli chcesz napisać artykuł, pomóc w tłumaczeniach lub
tworzeniu stron www, napisz do nas na kontakt@dworld.pl.
Do zobaczenia w czerwcu,
Grzegorz Duda
R ozkład Jazdy
JEP. gEt t Eam (). say t hank y ou ();
2
C o w tRawiE PiszCzy ...
3
P iERwszE kRoki w s Cali
4
s PRing kontEnER wstRzykiwania zalEżnośCi
12
g lassfish E ntERPRisE : 5 9’ s z hadB
20
l og 4 J a komunikatoRy intERnEtowE
43
a PlikaCJE f lEx z B lazE ds
49
t RansakCJE w systEmaCh J ava E ntERPRisE : w PRowadzEniE
56
m istRz P RogRamowania : R EfaktoRyzaCJa , Cz . iii
73
2
759364129.320.png 759364129.360.png 759364129.389.png 759364129.001.png 759364129.054.png 759364129.056.png 759364129.057.png 759364129.060.png 759364129.065.png 759364129.070.png 759364129.072.png 759364129.075.png 759364129.086.png 759364129.097.png 759364129.098.png 759364129.104.png 759364129.106.png 759364129.108.png 759364129.114.png 759364129.119.png 759364129.120.png 759364129.122.png 759364129.126.png 759364129.130.png 759364129.133.png 759364129.135.png 759364129.141.png 759364129.142.png 759364129.144.png 759364129.147.png 759364129.151.png 759364129.156.png
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
759364129.289.png
 
 
 
 
 
 
759364129.307.png
 
 
759364129.314.png
 
 
759364129.325.png
 
 
759364129.346.png
 
 
759364129.353.png
 
 
759364129.361.png 759364129.364.png 759364129.368.png
 
759364129.374.png
 
 
 
 
 
 
 
 
759364129.400.png
 
 
 
 
 
 
 
 
 
 
759364129.029.png
 
759364129.050.png 759364129.052.png 759364129.053.png 759364129.055.png
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
759364129.058.png
 
 
 
 
 
 
759364129.059.png
 
 
759364129.061.png
 
 
759364129.062.png
 
 
759364129.063.png
 
 
759364129.064.png
 
 
759364129.066.png 759364129.067.png 759364129.068.png
 
759364129.069.png
 
 
 
 
 
 
 
 
759364129.071.png
 
 
 
 
 
 
 
 
 
 
759364129.073.png
 
759364129.074.png 759364129.076.png 759364129.077.png 759364129.078.png 759364129.079.png 759364129.080.png 759364129.081.png 759364129.082.png 759364129.083.png 759364129.084.png 759364129.085.png 759364129.087.png 759364129.088.png 759364129.089.png 759364129.090.png 759364129.091.png 759364129.092.png 759364129.093.png 759364129.094.png 759364129.095.png 759364129.096.png
 
 
 
 
 
 
 
 
 
 
759364129.099.png 759364129.100.png
 
 
 
 
759364129.101.png 759364129.102.png 759364129.103.png
 
 
 
 
 
 
 
759364129.105.png
 
 
 
 
759364129.107.png
 
 
 
 
 
 
 
 
 
759364129.109.png
 
 
 
 
759364129.110.png 759364129.111.png 759364129.112.png 759364129.113.png 759364129.115.png 759364129.116.png 759364129.117.png 759364129.118.png
 
Megafon
C o w tRawiE PiszCzy ...
g RzEgoRz d uda
ScreenSnipe
Czy to bugzilla, czy Jira, czy inny bug trac-
ker, to wiele od jakości buga zależy od te-
sterów. Oni podają kroki do reprodukcji
buga i załączają niezbędne informacje.
Bardzo często załączają zrzut ekranu. Ale
co tester, to inny format i wiele razy zda-
rzało się, że zrzut w bmp zajmował kilka
MB.
Polecamy książki
Jeśli JAVA exPress to
dla Was za mało wie-
dzy, to chcielibyśmy
polecić Wam 2 książ-
ki Wydawnictwa He-
lion. Pierwszą z nich
powinniście znać pod
angielskim tytułem
„Efecive Java”, której
autorem jest Joshua
Bloch. Polski tytuł to Java. Efektywne Pro-
Marzyło mi się narzędzie, które zautoma-
tyzuje proces tworzenia buga. No i jest. Co
lepsze, to powstało ono w Polsce, a kon-
kretniej w grupie Spartez z Gdańska.
Druga książka to no-
wość. Autora, wójka
Boba (Uncle Bob), nie
trzeba przedstawiać.
Z czystym sumieniem
polecamy Czysty Kod.
ScreenSnipe umożliwia nie tylko pobranie
zrzutu ekranu, ale także dodanie adnota-
cji, powiększeń, zaznaczeń itp. A co lepsze
integruje się z JIRĄ.
Warto przyglądnąć się temu narzędziu na
Code Bubbles
Ostatnio wiele o tym się mówi. Jedni uwa-
żają to za przyszłość IDE, inni za zabawkę,
a jeszcze inni za dobry materiał na pracę
doktorską. Ja jestem gdzieś pomiędzy dru-
gą i trzecią grupą, ale z całą pewnością
warto przyjrzeć się Code Bubbles . Chociaż-
by po to, aby zobaczyć jak inaczej można
podejśc do tematu IDE. Zamiast tworzyć
kolejny klon Eclipse’a, warto zrobić krok
milowy i wyprzedzić całą konkurencję.
Konferencje
Zakończyła się konferencja 4Developers ,
a niedługo już kolejna. W Poznaniu odbę-
dzie się w dniach 12-14 maja konferencja
GeeCON , a 26 czerwca, w Warszawie Ja-
varsovia . Mam nadzieję, że JAVA exPress
pojawi się w Warszawie tym razem. Do
trzech razy sztuka.
Ale to nie koniec w tym roku. W paździer-
niku jak zwykle można liczyć na JDD . Bę-
dzie fajnie jak zwykle.
Pewnie nie tym razem, ale któraś kolejna
próba na pewno się powiedzie.
Dodatkowo COOLuary nabiorą nieco ru-
mieńców. Już w drugiej połowie maja od-
będzie się czwarta edycja COOLuarów . Tym
razem poprzedzona będzie całodzienną
konferencją w standardowej formule. Ale
jak to na Developers World przystało, spo-
dziewajcie się niecodziennego podejścia
do tematu. Więcej wkrótce na dworld.pl .
Pamiętacie Wolfram Alfa ? Też miało zwo-
jować świat, a póki co nadal to jest jedynie
ciekawostka jak można inaczej zrobić wy-
szukiwarkę.
Czy w swoich projektach podąrzasz za in-
nymi, czy szukasz nowych rozwiązań?
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
759364129.121.png
 
 
 
 
 
 
759364129.123.png
 
 
759364129.124.png
 
 
759364129.125.png
 
 
759364129.127.png
 
 
759364129.128.png
 
 
759364129.129.png
 
 
759364129.131.png
 
759364129.132.png
 
 
 
 
 
 
 
 
759364129.134.png
 
 
 
 
 
 
 
 
 
 
759364129.136.png
 
759364129.137.png 759364129.138.png 759364129.139.png 759364129.140.png
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
759364129.143.png
 
 
 
 
 
 
759364129.145.png
 
 
759364129.146.png
 
 
759364129.148.png
 
 
759364129.149.png
 
 
759364129.150.png
 
 
759364129.152.png 759364129.153.png 759364129.154.png
 
759364129.155.png
 
 
 
 
 
 
 
 
759364129.157.png
 
 
 
 
 
 
 
 
 
 
759364129.158.png
 
759364129.159.png 759364129.160.png 759364129.161.png 759364129.162.png 759364129.163.png 759364129.164.png 759364129.165.png 759364129.166.png 759364129.167.png 759364129.168.png 759364129.169.png 759364129.170.png 759364129.171.png 759364129.172.png 759364129.173.png 759364129.174.png 759364129.175.png 759364129.176.png 759364129.177.png 759364129.178.png 759364129.179.png 759364129.180.png 759364129.181.png 759364129.182.png 759364129.183.png 759364129.184.png 759364129.185.png 759364129.186.png 759364129.187.png 759364129.188.png 759364129.189.png 759364129.190.png 759364129.191.png 759364129.192.png 759364129.193.png 759364129.194.png 759364129.195.png 759364129.196.png 759364129.197.png 759364129.198.png 759364129.199.png 759364129.200.png 759364129.201.png 759364129.202.png 759364129.203.png 759364129.204.png
 
 
 
 
 
 
 
 
 
 
 
 
759364129.205.png
 
 
 
759364129.206.png 759364129.207.png 759364129.208.png
 
 
 
 
 
 
 
759364129.209.png
 
 
 
 
759364129.210.png
 
 
 
 
 
 
 
 
 
759364129.211.png
 
 
 
 
759364129.212.png 759364129.213.png 759364129.214.png 759364129.215.png 759364129.216.png 759364129.217.png 759364129.218.png 759364129.219.png 759364129.220.png 759364129.221.png 759364129.222.png 759364129.223.png 759364129.224.png 759364129.225.png 759364129.226.png 759364129.227.png 759364129.228.png 759364129.229.png 759364129.230.png 759364129.231.png 759364129.232.png 759364129.233.png 759364129.234.png 759364129.235.png 759364129.236.png 759364129.237.png 759364129.238.png 759364129.239.png 759364129.240.png 759364129.241.png 759364129.242.png 759364129.243.png 759364129.244.png 759364129.245.png 759364129.246.png 759364129.247.png 759364129.248.png 759364129.249.png 759364129.250.png 759364129.251.png 759364129.252.png 759364129.253.png 759364129.254.png 759364129.255.png
 
Poczekalnia
P iERwszE kRoki w s Cali
ł ukasz k uCzERa
If I were to choose language other than Java it would be Scala
James Gosling
Creator of Java
I can honestly say if someone had shown me the Programming in Scala boo� by �ar�
boo� by �ar�
in Oders�y, Lex Spoon & Bill Venners bac� in 2003 I’d probably have never created
Groovy.
Scala boo� by �ar�
James Strachan
Creator of Groovy
Historia
Scala to nowy bardzo ciekawy język pro-
gramowania. Łączy ze sobą dwa „światy”
programowania – świat programowania
obiektowego i świat funkcyjny. Historia
Scali zaczyna się trochę wcześniej niż w
2001 na Politechnice w Lozannie w Szwaj-
carii (EPFL), gdzie Marin Odersky wraz z
grupą studentów zakłada projekt nowe-
go języka. Wszystko zaczęło się od ekspe-
rymentalnego języka Pizza, który został
utworzony przez Odersky’iego i Philip’a
Wadler’a w 1998 roku. Wtedy obaj pano-
wie pracowali w Sun’ie nad rozwojem Javy
i zastanawiali się jak wprowadzic do języka
Generics (JSR-014). Wpadli wtedy na po-
mysł, że zrobią nowy język, który posłuży
im jako pole doświadczalne. Napisanie
nowego języka to dużo pracy, zysk był jed-
nak spory, oswobodzeni z Javy mogli pró-
bować nowych rzeczy, ograniczał ich tylko
JVM. Pizza ma Generics, domknięcia i pat-
tern matching. Wiosną 1998 do Odersky-
’iego i Wadler’a dołącza David Stoutamire
i Gilad Bracha bazując na doświadczeniach
Pizzy tworzą kolejny język – GJ (Generics
Java). Implementacja GJ została wcielo-
na do Javy pod postacią generics w 1.5
(praktycznie niezmieniona). Marin Ode-
rsky napisał kompilator do GJ, który stał
się podstawą javac, to było już w wersji
1.3 (2000), mimo to Generics były niedo-
stępne w języku, aż do wersji 1.5 (2004).
Orginalna wersja Odersky’iego została roz-
szerzona o „wildcards” czyli „? extends T”.
W 2001 Odersky przenosi się do Szwajcarii
na uniwersytet w Lozannie, gdzie zajmuje
stanowisko profesora metod programo-
wania i rozpoczyna pracę nad nowym ję-
zykiem.
Instalacja.
Do rozpoczęcia pracy wystarczy ściągnąć
dystrubucję ze strony domowej – htp://
www.scala-lang.org/downloads i zainsta-
lować. Do dyspozycji są dwie wersje – pod
konkretną plaformę bądź uniwersalny in-
stalator. Jeżeli nie korzystamy z instalatora
po rozpakowaniu należy ustawić zmienną
środowiskową SCALA_HOME na katalog
ze Scalą i do zmiennej PATH dodać kata-
log bin dystrybucji. Po tych zabiegach wpi-
sując „scala” w linii poleceń uruchamia
się interaktywny interpreter. Do małych
zadań, skryptowania, zabawy interpreter
jest doskonałym narzędziem, przy tworze-
niu większego projektu do dyspozycji są
trzy zintegrowane środowiska programi-
styczne: Netbeans, IntelliJ IDEA oraz Eclip-
se. W chwili pisania artykułu pluginy IDE
są piętą achillesową Scali, da się praco-
wać, trzeba jednak przygotować się na to
że nie wszystko będzie działało tak samo
dobrze jak dla Javy.
Scala jest językiem w pełni obiektowym to
znaczy wszystko jest obiektem, jest też ję-
4
759364129.256.png 759364129.257.png 759364129.258.png 759364129.259.png 759364129.260.png 759364129.261.png 759364129.262.png 759364129.263.png 759364129.264.png 759364129.265.png 759364129.266.png 759364129.267.png 759364129.268.png 759364129.269.png 759364129.270.png 759364129.271.png 759364129.272.png 759364129.273.png 759364129.274.png 759364129.275.png 759364129.276.png 759364129.277.png 759364129.278.png 759364129.279.png 759364129.280.png 759364129.281.png 759364129.282.png 759364129.283.png 759364129.284.png 759364129.285.png 759364129.286.png 759364129.287.png 759364129.288.png
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
759364129.290.png
 
 
 
 
 
 
759364129.291.png
 
 
759364129.292.png
 
 
759364129.293.png
 
 
759364129.295.png
 
 
759364129.296.png
 
 
759364129.297.png 759364129.298.png 759364129.299.png
 
759364129.300.png
 
 
 
 
 
 
 
 
759364129.301.png
 
 
 
 
 
 
 
 
 
 
759364129.302.png
 
759364129.303.png 759364129.304.png 759364129.305.png 759364129.306.png
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
759364129.308.png
 
 
 
 
 
 
759364129.309.png
 
 
759364129.310.png
 
 
759364129.311.png
 
 
759364129.312.png
 
 
759364129.313.png
 
 
759364129.315.png 759364129.316.png 759364129.317.png
 
759364129.318.png
 
 
 
 
 
 
 
 
759364129.319.png
 
 
 
 
 
 
 
 
 
 
759364129.321.png
 
759364129.322.png 759364129.323.png 759364129.324.png 759364129.326.png 759364129.327.png 759364129.328.png 759364129.329.png 759364129.330.png 759364129.331.png 759364129.332.png 759364129.333.png 759364129.334.png 759364129.335.png 759364129.336.png 759364129.337.png 759364129.338.png 759364129.339.png 759364129.340.png 759364129.341.png 759364129.342.png 759364129.343.png
 
 
 
 
 
 
 
 
 
 
759364129.344.png 759364129.345.png
 
 
 
 
759364129.347.png 759364129.348.png 759364129.349.png
 
 
 
 
 
 
 
759364129.350.png
 
 
 
 
759364129.351.png
 
 
 
 
 
 
 
 
 
759364129.352.png
 
 
 
 
759364129.354.png 759364129.355.png 759364129.356.png 759364129.357.png 759364129.358.png 759364129.359.png
 
Poczekalnia
Póki co kod wygląda jak w języku
z dynamicznym typowaniem.
Nic bardziej mylnego. Scala jest statyczna
zykiem funkcyjnym, pozwala na tworzenie
metod wyższych rzędów, domknięć i prefe-
ruje obiekty niemutowalne. Kompiluje się
do bytecode’u Javy oraz do CLI .NET, poka-
zuje to że twórcom zależy na przenośności
języka i nie wiążą się ściśle z JVM’em.
jest taki jakbyśmy chcieli dlatego możemy
go podać jawnie:
scala> val x: Int = 2+2
scala> val y: Double = 2+2
Tam gdzie to możliwe Scala wykorzystuje
obiekty Javy. Powyższe wyrażenia zosta-
ną przez kompilator przetłumaczone naj-
prawdopodniej na Javowe int i double.
Znamiennym przykładem jest String:
Pierwszy kod
Wewnątrz interpretera, nie musimy dekla-
rować zmiennych. Zatem wpisując:
scala> val hello = „Hello, world
!”
hello: java.lang.String = Hello,
world !
scala> 2+2
Otrzymamy:
res0: Int = 4
Dla rozbudzenia apetytu, możesz spróbo-
wać wpisać w interpreterze:
Interpreter przypisuje to co wpisujemy
do kolejnych zmiennych o nazwie res[n].
W Scali nie ma też operatorów w trady-
cyjnym sensie. To znaczy operatory są za-
implementowane w bibliotece, nie jest to
element języka. Dlatego powyższy zapis
jest skrótem od takiego:
scala>
„Hello,
world”.
foreach(println(_))
Powyższy zapis korzysta z kilku funkcjo-
nalności języka: pełnej obiektowości, im-
plicit conversions (domyślnych konwersji),
funkcji wyższych rzędów oraz czegoś co
nazywa się placeholder syntax (składnia
zastępnikowa ?). W tej części opiszę m.in.
implicit conversions.
scala> (2).+(2)
Oznacza to nic innego jak wywołanie me-
tody „+” na obiekcie typu Int z argumen-
tem Int w notacji tzw. operatorowej. Jeżeli
metoda przyjmuje tylko jeden argument,
można ją wywoływać bez kropki i nawia-
sów. Jest to jeden z elementów który po-
zwala na szybkie i łatwe tworzenie DSL’i
(Domain Speciic Language) w Scali. Poniż-
szy zapis przypisuje cztery do zmiennej x
(właściwie wartości, ale o tym za chwilę).
Deinicja funkcji:
scala> def double(x: Int): Int =
x*2
Powyższy zapis deinuje funkcję o nazwie
double z jednym parametrem Int, zwraca-
jącą typ Int. W funkcjach ostatnia zapis jest
zwracany dzięki temu nie ma obowiązku
pisania słówka kluczowego returns, jest to
opcjonalne. Co instotne Inferencer jest w
stanie wypełnić za nas typ zwracany przez
funkcję:
scala> val x = 2+2
Póki co kod wygląda jak w języku z dyna-
micznym typowaniem. Nic bardziej myl-
nego. Scala jest statyczna, dzięki inferen-
cji (wnioskowania) typów nie musimy ich
jawnie podawać, kompilator zrobi to za
nas. Oczywiście nie zawsze otrzymany typ
scala> def double(x: Int) = x*2
double: (Int)Int
Jeżeli funkcja, metoda jest zbyt długa aby
5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
759364129.362.png
 
 
 
 
 
 
759364129.363.png
 
 
759364129.365.png
 
 
759364129.366.png
 
 
759364129.367.png
 
 
759364129.369.png
 
 
759364129.370.png
 
 
759364129.371.png
 
759364129.372.png
 
 
 
 
 
 
 
 
759364129.373.png
 
 
 
 
 
 
 
 
 
 
759364129.375.png
 
759364129.376.png 759364129.377.png 759364129.378.png 759364129.379.png
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
759364129.380.png
 
 
 
 
 
 
759364129.381.png
 
 
759364129.382.png
 
 
759364129.383.png
 
 
759364129.384.png
 
 
759364129.385.png
 
 
759364129.386.png 759364129.387.png 759364129.388.png
 
759364129.390.png
 
 
 
 
 
 
 
 
759364129.391.png
 
 
 
 
 
 
 
 
 
 
759364129.392.png
 
759364129.393.png 759364129.394.png 759364129.395.png 759364129.396.png 759364129.397.png 759364129.398.png 759364129.399.png 759364129.401.png 759364129.402.png 759364129.403.png 759364129.404.png 759364129.405.png 759364129.406.png 759364129.407.png 759364129.408.png 759364129.409.png 759364129.410.png 759364129.411.png 759364129.412.png 759364129.413.png 759364129.414.png 759364129.415.png 759364129.416.png 759364129.417.png 759364129.418.png 759364129.419.png 759364129.420.png 759364129.421.png 759364129.422.png 759364129.423.png 759364129.424.png 759364129.425.png 759364129.426.png 759364129.427.png 759364129.428.png 759364129.429.png 759364129.430.png 759364129.431.png 759364129.432.png 759364129.433.png 759364129.434.png 759364129.435.png 759364129.436.png 759364129.437.png 759364129.438.png 759364129.439.png
 
 
 
 
 
 
 
 
 
 
 
 
759364129.440.png
 
 
 
759364129.441.png 759364129.442.png 759364129.443.png
 
 
 
 
 
 
 
759364129.444.png
 
 
 
 
759364129.002.png
 
 
 
 
 
 
 
 
 
759364129.003.png
 
 
 
 
759364129.004.png 759364129.005.png 759364129.006.png 759364129.007.png 759364129.008.png 759364129.009.png 759364129.010.png 759364129.011.png 759364129.012.png 759364129.013.png 759364129.014.png 759364129.015.png 759364129.016.png 759364129.017.png 759364129.018.png 759364129.019.png 759364129.020.png 759364129.021.png 759364129.022.png 759364129.023.png 759364129.024.png 759364129.025.png 759364129.026.png 759364129.027.png 759364129.028.png 759364129.030.png 759364129.031.png 759364129.032.png 759364129.033.png 759364129.034.png 759364129.035.png 759364129.036.png 759364129.037.png 759364129.038.png 759364129.039.png 759364129.040.png 759364129.041.png 759364129.042.png 759364129.043.png 759364129.044.png 759364129.045.png 759364129.046.png 759364129.047.png 759364129.048.png 759364129.049.png 759364129.051.png
 
Zgłoś jeśli naruszono regulamin