Część 1: Praca z kolekcjami
Podczas pracy z większą liczbą obiektów używamy klas grupujących. Są to statyczne, lub dynamiczne obiekty, które pozwalają odwoływać się do zbioru elementów w wygodny sposób. Klasy kolekcyjne w zależności od swojego typu (lista, drzewo, set, hasztablica) mogą implementować różne interfejsy (zbiory metod). Użycie odpowiedniej klasy wpływa zawsze na sposób wykonywania programu (przechowywanie powtórek, sortowanie, wyszukiwanie). Dlatego zrozumienie kolekcji jest kluczowe dla tworzenia dobrego programu.
poniżej przykład użycia kolekcji. Program wczytuje plik o nazwie linie.txt (trzeba go utworzyć, lub zmodyfikować skrypt) i umieszcza każdą linię pliku w 3 kolekcjach: ArrayList, HashSet i TreeSet. Każda kolekcja innaczej wykonuje operacje dodawania (mimo że sam zapis dodawania obiektu jest identyczny).
Przeglądanie kolekcji lub operacje na jej obiektach wymagają czasem odwołania się po kolei do każdego jej elementu. Uzywamy do tego obiektu Iteratora. Obiekt ten posiada kilka metod np:
hasNext() - sprawdza, czy mamy jeszcze obiekty do przejrzenia,
next() - przechodzi do kolejnego obiektu,
remove() - wyrzuca aktualny obiekt z kolekcji.
Część 2: Typy obiektów i wykrywanie
Poniżej umieszcza program używający iteratora do przejrzenia kolekcji obiektów w celu
zsumowania wszystkich obiektów typu Integer.
W programie przedstawiłem kilka metod sprawdzających typ obiektu:
instanceof - operator sprawdza, czy dany obiekt jest podanego typu. Ta technika nie konwertuje niczego na typ całkowity. Sprawdzany jest typ a nie zawartość obiektu.
if(x instanceof Integer)
println "instanceOf wykrył integer: " + x.toString()
toInteger() - metoda konwertuje obiekt na liczbę całkowitą i jeżeli nie uda się tego zrobić wyrzucany jest wyjątek (dlatego trzeba opakować w try-catch). Metoda nie wykrywa typu, ale to, czy obiekt da przekonwertować się na ten typ.
try{
if(x.toInteger())
println "toInteger() wykrył integer: " + x.toString()
}catch(Exception e){
}
getClass().getName().equals ("java.lang.Integer") - metoda sprawdza, czy nazwa klasy danego obiektu jest taka sama jak napis podany w argumencie do "equals". Należy podać pełną nazwę klasy (razem z nazwą pakietu). Metoda nie jest zależna od wartości obiektu i nie robi konwersji typu.
if(x.getClass().getName().equals ("java.lang.Integer")){
//..jak jest
}
else{
//...jak nie jest
}
|