Ukryta implementacja

advertisement
Ukryta implementacja
Witold Grzelczak
[email protected]
Ale o co chodzi…?
Ukryta implementacja?
Opowiedziałbym coś o tym, ale
muszę odebrać zapasową pelerynę z
pralni.
Nu pagadi Zorro!
Tu sierżant Garcia
mówi.
Ale o co chodzi…???



Ukrywanie implementacji to ogólnie rozumiana kontrola
dostępu. Określa dokładnie co użytkownik klasy może w niej
zmieniać, a czego nie.
Dziś zajmiemy się wyjaśnieniem kilku podstawowych pojęć.
Dowiemy się o konwencji nazewnictwa plików w Javie. Poznamy
modyfikatory dostępu oraz inne, fascynujące rzeczami, które
każdy szanujący się student EZI wiedzieć powinien :-)
Poznamy ładne pojęcie hermetyzacji.
Ready to go?! Go!
Kto lubi LEGO?
WSZYSCY!!!

Niewątpliwą zaletą JAVY jest możliwość korzystania z gotowych
„klocków”, czyli bibliotek komponentów. Są one umieszczane
w pakietach. Zawierają w sobie gotowe klasy, dzięki czemu nie
musimy pisać wszystkiego od podstaw. Wystarczy znaleźć
odpowiednią bibliotekę i wykorzystać jej komponenty.

Używając polecenia import, możemy używać klas znajdujących się
w bibliotekach, tak jakby ich deklaracje znajdowały się w naszym
kodzie programu.
Jak się bawić LEGO?

Do biblioteki, lub do jej części, możemy odwołać się na dwa sposoby:

Poprzez użycie słowa import
folder biblioteka
wszystkie klasy
import java.util.*;

Funkcja ta powoduje wprowadzenie do programu całej biblioteki.
Możemy teraz odwoływać się bezpośrednio do klasy ArrayList (która jest
częścią tej biblioteki)
Bądź poprzez podanie ścieżki dostępu:
(import) java.util.arraylist
W tym przypadku wykorzystujemy zarządzanie plikami OS-u. Kropki są
zamienianie na „/” lub „\”. Dodatkowo folder java musi się z znajdować
w folderze zadeklarowanym w zmiennej CLASSPATH
Chińszczyzna na zimno czyli
„smaczki”
Gdy tworzymy plik z kodem źródłowym Javy, jest on
powszechnie nazywany jednostką kompilacji. Nazwa każdej
jednostki musi mieć rozszerzenie .java . Wewnątrz takiej
jednostki może znajdować się maksymalnie jedna klasa
publiczna o takie samej nazwie, jak jednostka kompilacji.
Dokładność trzeba zachować nawet co do wielkości liter, ale bez
rozszerzenia .java. Reszta klas jest ukryta przed świat(ł)em
zewnętrznym. Stanowią one klasy wspierające.
Vifon: I mam wszystko w … pakiecie

package to instrukcja umożliwiająca udostępnieni już
skompilowanych plików .class. Używa się jej podczas
pisania struktur, które chcemy wykorzystać w
przyszłości. Przy tworzeniu takiego pakietu, wymagane
jest, aby instrukcja package znajdowała się w pierwszej
linii kodu, nie będącej komentarzem, czyli:
//:com:bruceeckel:simple:List.java
// Tworzenie pakietu
package com.bruceeckel.simple;
public class List {
...
}
Wypadki chodzą po ludziach,
czyli kolizje.

Co się dzieje, gdy zaimportujemy dwie biblioteki
zawierające te same nazwy?
import pl.witoldgrzelczak.simple.*;
import java.util.*
Załóżmy, że w obu znajduje się klasa o nazwie Vector.
Powoduje to potencjalną kolizję. Kompilator zgłosi
błąd jedynie w wypadku, gdy stworzymy tę klasę:
Vector w = new Vector();
Add – remove - full custom

Dzięki wykorzystaniu opcji package oraz import
możemy sami tworzyć biblioteki. Mamy możliwość
stwarzać własne skróty do najczęściej wpisywanych
komend, bądź nawet pisania własnych pakietów, które
mogą zostać wykorzystane przez innych użytkowników.
P.rint(s)
zamiast
System.out.print(s)
Modyfikatory dostępu

Mamy trzy, a nawet cztery stopnie dostępu:
pakietowy
public
protected
private
Batman…?
W dzisiejszych czasach
nawet Batman musi się
znać na programowaniu…
Kiedy mam wolną chwilę
to stawiam pasjansa - bez
Jokerów.
Pakietowy

Jest to domyślny stopień dostępu i nie posiada swojego słowa kluczowego.
Klasy tego samego pakietu posiadają dostęp nawzajem do swoich
elementów, jednak dla klas poza pakietem wydaje się on prywatny.
Dzięki zastosowaniu dostępu pakietowego, wszystkie klasy wewnątrz tej
samej jednostki kompilacji (pliku) są automatycznie dostępne dla siebie.

Jedynymi sposobami przyznania dostępu do składnika są:
Uczynienie składnika publicznym (modyfikator public),
Zapewnienie dostępu do składnika w ramach pakietu,
Klasa pochodna ma dostęp do składników chronionych (protected) oraz
publicznych (public), nie ma natomiast dostępu do składników prywatnych
(private).
Użycie metod udostępniania get / set. (ale o tym później)
1.
2.
3.
4.
(boston) public
Słowo kluczowe public czyni deklarację następującą po nim
dostępną dla całego świata.
np.:
funkcja dostępna for-everyone
package biblioteka.ksiazka;

public class Cookie {
public Cookie() {
system.out.println("Konstruktor klasy Cookie");
}
void bite () {System.out.println("metoda bite");}
}
funkcja niedostępna jedynie dla klas pakietu
Private – do not disturb
Modyfikator private oznacza, że do danego
składnika klasy nie ma dostępu nikt poza jego
własną klasą. Inne klasy tego samego pakietu nie
mają dostępu do składowych prywatnych.
Może zostać użyty do zablokowania
bezpośredniego dostępu do konstruktora
(hermetyzacja).
Protected
Jeżeli tworzymy nowy pakiet i dziedziczymy po
klasie z innego pakietu, wtedy jedynymi
składowymi, do których mamy dostęp, są
składowe publiczne pakietu oryginalnego.
Jednakże czasem twórca klasy bazowej pragnie
udzielić dostępu do określonego składnika
klasom pochodnym, jednak nie chce go udzielać
wszystkim. Do tego służy modyfikator
protected.
Klasy, a modyfikatory
Tworząc nową klasę dostępną w obrębie pakietu, warto
zadbać o to, aby pola były jak najbardziej prywatne; jeśli
chodzi o metody, to warto stosować dostęp pakietowy
o ile nie koliduje to z ogólną koncepcją programu.
Cała klasa nie może być prywatna lub chroniona.
Wtedy byłaby niedostępna dla użytkownika. Jeżeli nie
chcemy, aby ktokolwiek miał dostęp do klasy, wtedy
możemy uczynić wszystkie konstruktory prywatnymi,
uniemożliwiając wszystkim, poza nami, dostęp do nich.
cdn. czyli Niekończąca się opowieść
cz. II
Trzeba pamiętać, że jeżeli nie stworzymy jawnie
chociaż jednego konstruktora, to zostanie
wyprodukowany konstruktor domyślny
(bezargumentowy). Dzięki napisaniu
konstruktora domyślnego zapobiegamy jego
automatycznemu utworzeniu.
To byłoby na tyle
„Koniec i bomba,
a kto czytał, ten trąba!”*
* Witold Gombrowicz „Ferdydurke”
Bibliografia



Eckel Bruce „Thinking in JAVA edycja polska,
wydanie 3”, wyd. Helion, Gliwice 2003
Kathy Sierra & Bart Bates „Head first JAVA”
wyd. Helion, Gliwice 2005,
Google
Download