Category Archives: SCJP

Oficjalny nowy projekt – SCJPTester

W ostatnich bojach z Mavenem nie powiedziałem słowa o tym, do czego będzie służyła aplikacja, którą zamierzam tworzyć. Pewnikiem niektórzy domyślili się po nazwie, która przewijała się w screenach z widoku projektu, ale też i na niewiele się to zdało, gdyż ostatecznie nazwę zmieniłem. Panie i Panowie – przed Wami SCJPTester!

Spora część ruchu na blogu jest generowana poprzez zawartość powiązaną z certyfikatem SCJP. Zatem naturalnym rozwinięciem mojego contentu byłoby stworzenie aplikacji, która dałaby możliwość symulacji prawdziwego egzaminu. I taką właśnie funkcjonalność będzie posiadał SCJPTester – napisany z pomocą Mavena, Springa, Springa MVC, a także jakiegoś systemu szablonów integrującego się ze Springiem (nie wybrałem jeszcze żadnego), prace trwają. Zastanawiam się czy nie uderzyć z obsługą frontendu od strony AJAXa i interfejsu w GWT. Kozioł próbował przekonać mnie do Vaadina, że niby lepszy niż GWT, ale moim przekleństwem jest to, iż cały czas “zaliczam” technologie, które są najbardziej popularne i do nich niestety należy GWT, zaś Vaadin nie. Ale to jeszcze pogrzebię, przygoda z Mavenem jeszcze się nie skończyła 🙂

Java exPress, a sprawa Chlebika po raz drugi

Tadam! Po miesięcznym poślizgu wydawniczym “nadejszła wielkopomna chwila” jak mówił pewien znany człowiek – pojawił się kolejny numer Java exPress!

Co w tym takiego wielkiego? Ano to, iż znaleźć tam można artykuł, który popełniłem jakiś czas temu, a który jest kompilacją wpisów dotyczących SCJP. Wszystko zebrane w jednym miejscu, ładnie poskładane i wydane. Miłej lektury.

Michał Piotrowski Sun Certified Java Programmer

W końcu po prawie miesiącu od zdania dostałem fajną przesyłkę od firmy Sun. A w niej pierwszy dyplom do zawieszenia na moim ‘Wall of Fame’.

Certyfikaty SUNa mają to do siebie, że dostaje się kilka bajerków po ich zdaniu. Pierwszy z nich to fajna wizytówka w formie karty kredytowej (twardy plastik). Dzięki temu (o ile w ogóle będzie potrzeba) nie ma konieczności targania ze sobą certyfikatu. Zaś sam dyplomik wygląda tak:

mojSCJP

Trochę krzywo się zeskanował, ale przyczyną tego problemu jest… poczta. Otóż dostałem przesyłkę od SUNa zwykłym listem przysłanym z zagranicy (Malmo, 16 września, odebrałem wczoraj zatem trochę im zeszło). Wszystko fajnie, tylko czemu koperta była z gatunku ‘tekturowych’, bez jakiegokolwiek zabezpieczenia w srodku! I właśnie dlatego otrzymana przesyłka w kilku miejsach wygląda jak z gardła wyciągnięta (zakładam, że to wina wilgoci). Nierówna faktura objawia się niemożnością poprawnego zeskanowania niestety. Mam przynajmniej nadzieję, że kiedy włożę ten dyplom do antyramy to się sprasuje i będzie wyglądał cokolwiek lepiej. Pozostaje tylko mieć nadzieję, że kolejne certyfiakty zostaną dostarczone w trochę lepszym stanie.

SCJP – ZDANY

Tak, tak moi drodzy – w tym pięknym dniu 11 września (rocznica psiamać) Anno Domini 2009 zdałem tenże egzamin. Rzecz ta miała miejsce w Warszawie w centrum egzaminacyjnym BizTech przy ulicy bodajże Wolność. I tyle.

No może nie tyle – wszak wpis byłby zbyt krótki. Konkretnie zdawałem już nową wersję egzaminu o czy pisałem już wcześniej. I co? No i nie wiem. Oczywiście egzamin zdany, ale z wynikiem 71%. Hmmm, trochę kiepsko. Jedakże trzeba spojrzeć na wyniki:

Declarations, Initializations, Scoping 80%
Flow Control 81%
API Contents 42%
Concurrency 100%
OO Concepts 50%
Collections/Generics 75%
Fundamentals 77%
Questions 43/60

Zasadniczo poza API i OO Concepts wszystko poszło mi całkiem dobrze (100% ze współbieżności!!). Kwestia po prostu jest taka – w rzeczach, które podpowiada IDE zasadniczo jestem kiepski. Choć to dziwne, gdyż w moim odczuciu wszystkie pytania o API były całkiem proste ( albo o to właśnie chodziło by tak wyglądało ), zaś koncepcje programowania obiektowego to też zakładam, że rozumiem (nawet posługując się na co dzień PHP). Podsumowując – nie wiem co o tym myśleć.

Jednakże certyfikat już posiadam – zatem można założyć, iż pewną wiedzą o samym języku jestem się w stanie wykazać. Zatem mogę bez wstydu odpowiadać na ogłoszenia o pracę, gdzie “wyższe studia informatyczne” są koniecznie potrzebne. Przynajmniej w dziedzinie samej Javy obronię się bez problemu.

Co dalej? Ano w końcu po pewnym okresie przerwy powrócę do programowania. Czyli kontynuacja ProgramBash, a także zamierzam z drugiej strony rozpocząć naukę w dziedzinie narzędzi Javy, ale nie będących frameworkami. Konkretnie chodzi o web-services, parsery XMLa, narzędzia do zarządzania projektem czy ciągłej integracji. Dwutorowość póki co dobrze mi wychodziła, mam nadzieję, że tym razem będzie tak samo.

I znowu ciekawe zmiany w SCJP

Pisałem nie tak dawno o zmianach w ilości pytań egzaminacyjnych (tym samym progu zdania) dla SCJP w wersji 1.6. Co ciekawe dalszych zmian nie ma końca – w tym jednakże przypadku mogę powiedzieć z całą pewnością – jest lepiej.

Czego konkretnie dotyczą zmiany? Otóż rzecz w wykreśleniu z wymagań dla egzaminu trzech dość istotnych wymagań (no, może dwa są dość istotne):

“Develop code that declares both static and non-static methods, and – if appropriate – use method names that adhere to the JavaBeans naming standards. Also develop code that declares and uses a variable-length argument list.”

“Develop code that serializes and/or de-serializes objects using the following APIs from java.io: DataInputStream, DataOutputStream, FileInputStream, FileOutputStream, ObjectInputStream, ObjectOutputStream and Serializable.”

“Given a scenario, write code that makes appropriate use of wait, notify, or notifyAll.”

Czyli serializację i połowę potencjalnych pytań o wątki szlag trafił. Pewnie są to dość istotne zagadnienia (czy aby na pewno?) z punktu widzenia programisty Java, jednakże raczej nikt nie spodziewa się, iż po zdaniu SCJP nagle człowiek staje się guru programowania. Ja zatem jakoś specjalnie za nimi nie płaczę. Stosowny temat na JavaRanch można znaleźć pod tym adresem.

Best of the best z SCJP

Ostatnio sporo w tym temacie się u mnie dzieje (dlatego wpisy trochę przystopowały). Testowy egzamin robię średnio 2h i po przejrzeniu poprawnych odpowiedzi z definicji jestem tak skonany, że nic już mi się nie chce. Jednakże dziś taka mała gratka dla wszystkich programistów Javy – niezależnie czy przygotowują się do egzaminu czy nie – całkiem spora lista rzeczy, które zapisałem sobie podczas przerabiania testowych egzaminów, a które są dość podchwytliwe i mogą łatwo człowieka wywieść na manowce.

Listę będę starał się cały czas aktualizować. Jak już zdam ten nieszczęsny egzamin to pewnie powstanie kolejna strona na blogu poświęcona SCJP i tam pewnikiem umieszczę wszystkie materiały. Gdyby ktoś chciał dodać do tej listy jakiegoś “onelinera” to proszę o mejla lub komentarz.

  • w przypadku klas Boolean otrzymują one wartość TRUE tylko wówczas, jeśli przekazaną wartością do konstruktora jest “true” – niezależnie od wielkości liter. Wszystko inne (łącznie z NULL) daje FALSE.
  • w przypadku przekazywania do metod/klas pracujących nad tokenizacją tekstu jakichkolwiek wzorców należy pamiętać, że w klasie String należy używać 2 slashy by wprowadzić znak specjalny (np. “\\s”)
  • zsynchronizowane mogą być tylko metody oraz bloki kodu
  • uśpienie obecnie działającego wątku (za pomocą Thread.sleep()) z podaniem wartości czasowej (pamiętajmy – milisekundy) powoduje, że upłynie MINIMUM dany okres czasu zanim wątek ten powróci do gry. Może to być więcej, jeśli np. w tym czasie JVM przydzieli czas innym wątkom będącym na tym samym poziomie uprzywilejowania.
  • wątek kończy swe działanie wówczas, gdy kończy wykonywać się jego metoda run(). Tutaj warto zwrócić uwagę na to, że metoda start() klasy Thread wywołuje swą metodę run().
  • method inner-classes nie mogą korzystać ze zmiennych lokalnych, chyba że są one zadeklarowane jako final
  • skompilowanie programu z użyciem asercji to nie do końca to samo co uruchomienie programu z użyciem asercji
  • warto pamiętać o zasadach dotyczących nadpisywania i przeciążania metod. Zwłaszcza o tej, że metoda statyczna nie może być nadpisana przez niestatyczną i vice versa. Przeciążanie zaś polega na zmianie parametrów oraz na opcjonalnej zmianie zwracanego typu.
  • Unreachable statement to nie wyjątek tylko błąd czasu kompilacji!
  • porównywanie typów prostych z klasami opakowującymi za pomocą metody equals jest jak najbardziej OK. Autoboxing da sobie z tym radę.
  • dzielenie modulo działa dość prosto – zawsze zwraca wartość INT, a z kolei znak jest uzależniony od znaku lewego operandu
  • modyfikator abstract private jest możliwy tylko w przypadku klas wewnętrznych
  • poprzez instrukcje statycznego importu (import static) możemy zaimportować tylko stałe i metody
  • zmienne interfejsu są domyślnie stałę (public, static, final), zaś metody interfejsu są domyślnie public i abstract).
  • kiedy metoda nie zwraca wartości (typ void), wówczas można w ciele takiej metody czystej instrukcji return;. Kod taki się skompiluje i wszystko jest OK. Jeśli jednakże metoda deklaruje, że zwróci jakąś wartość, wówczas zwraca tą wartość lub NULL.
  • konstruktor klasy String tworzy nowy obiekt za każdym razem. Używanie do tworzenia łańcuchów przeciążonego operatora równości powoduje pierwej wyszukanie tworzonej wartości w istniejącej puli łańcuchów.
  • pamiętajmy o porówywaniu typów prostych z klasami opakowującymi i tych samych klas opakowujących. Dotyczy ten temat liczb z przedziału -128 do 127, a także wartości Boolean oraz Char (w pewnym przedziale).
  • przy metodach operujących na łańcuchach (StringBuilder też się łapie) pamiętajmy, że w metodach dwuargumentowych drugi parametr jest cyfrą, która licząc znaki od 0 jest pierwszą literą, która zostanie z istniejącego obiektu po dokonaniu danej operacji (np. metody substring czy delete).
  • klasa File posiada mało znane (w kotenkście egzaminu) metody canRead() oraz canWrite()), która wskazuje czy dany plik da się odczytać/zapisać.
  • metoda getInstance() z parametrem typu Locale istnieje tylko dla klas Calendar oraz NumberFormat.
  • zmienne zadeklarowane w blokach inicjalizacyjnych nie są dostępne poza nimi.
  • tablice można też tworzyć w ten sposób:
    int[] a = {1};
  • klasy anonimowe (anonymous inner-classes) nie mogą posiadać deklaracji statycznych
  • w przypadku typów wyliczeniowych należy pamiętać, iż wyszczególnienie elementów zbioru musi być pierwszą rzeczą w kodzie tworzącym typ wyliczeniowy.
  • naturalny porządek sortowania łańcuchów tekstowych to:
    • białe znaki
    • “krzaczki” (np. @)
    • cyfry
    • wielkie litery
    • małe litery
  • tablice mogą mieć rozmiar 0
  • liczby typu float oraz double można dzielić przez zero!!! Spowoduje to zwrócenie wartości “Inifinity”
  • dla przypomnienia – wynikiem działań matematycznych jest domyślnie wartość int
  • wywołanie System.gc() nie daje pewności, że GC w ogóle ruszy
  • wartości prymitywne w kolekcjach są sortowane z użyciem własnych zasad. Nie da się do nich zastosować klas implementujących Comparator.
  • przeszukiwanie tablic oraz kolekcji musi odbywać się za pomocą takiego samego Comparatora, co sortowanie.

Zmiany zasad dla SCJP

Anom. Postanowiłem sobie w końcu zakupić voucher na egzamin. Jest on ważny rok, zatem nie obliguje mnie do zapisywania się na egzamin w perspektywie najblizszego tygodnia. Grzecznie odwiedziłem stronę firmy Sun i dotarłem na odpowiednią stronkę. I zonk!

Było trochę późno (w sumie jak zawsze kiedy coś próbuję w javie zdziałać 🙂 i dlatego na początku pomyślałem, że coś pokiełbasiłem. No ale patrzę na oznaczenie 310-065, Sun Certified, itp – czyli wszystko ok. Natomiast piszą mi ni stąd, ni z owąd, iż egzamin ma 60 pytań i do jego zdania wystarcza coś koło 58%. WTF? Udałem się do mądrzejszych ode mnie, a tam odesłano mnie pod ten adres. No i faktycznie – zmiany są oczywiste. Czy lepiej, czy gorzej? Trudno póki co ocenić – niby mniej pytań to szansa na zrobienie mniejszej ilości błędów. Z drugiej jednak strony jak się jakoś krzywo cokolwiek wylosuje/trafi to będzie niefajnie. No cóż, korzystając z faktu, że delikatna niemoc gardła wykluczyła mnie z pracy zawodowej na parę dni douczam się cały czas i mam nadzieję, że niezależnie od ilości pytań wynik będzie satysfakcjonujący.