[ Pobierz całość w formacie PDF ]

sposób, aby była z niej zwracana tylko jedna wartość (w tym przypadku byłaby to war-
tość określająca położenie odnalezionego fragmentu łańcucha lub wartość -1, która
oznaczałaby, że poszukiwany fragment nie został odnaleziony) lub stworzyć klasę po-
mocniczą zawierającą obie zwracane informacje  liczbę całkowitą oraz wartość lo-
giczną. Jednak w standardowym API Javy można znalezć precedens  przedstawiony
przykład w dużym stopniu przypomina sposób wykorzystania klasy ParsePosition
(przedstawiony w recepturze 6.5). W każdym razie, omawiane tu możliwości funkcjo-
nalne są tak często przydatne i wykorzystywane, że doszedłem do wniosku, że ich
przedstawienie jest w pełni usprawiedliwione. Jednocześnie informuję, że w tworzonych
programach należy unikać stosowania rozwiązań tego typu!
272 Rozdział 8. Techniki obiektowe
Po tych wszystkich wyjaśnieniach, mogę w końcu przedstawić kod klasy MutableIn-
teger:
package com.darwinsys.util;
/** Klasa MutableInteger jest podobna do klasy Integer,
* lecz daje możliwość zmieniania przechowywanych liczb
* całkowitych w celu uniknięcia zbyt częstego
* tworzenia obiektów związanych z wykonywaniem operacji
* typu:
* c = new Integer(c.getInt()+1),
* które mogą być bardzo kosztowne, jeśli będą wykonywane
* zbyt często.
* Nie jest to klasa potomna klasy Integer, gdyż Integer
* jest klasÄ… sfinalizowanÄ… (dla uzyskania wysokiej
* efektywności działania:-))
*/
public class MutableInteger {
private int value = 0;
public MutableInteger() {
}
public MutableInteger(int i) {
value = i;
}
public void incr() {
value++;
}
public void incr(int amt) {
value += amt;
}
public void decr() {
value--;
}
public void setValue(int i) {
value = i;
}
public int getValue() {
return value;
}
public String toString() {
return Integer.toString(value);
}
public static String toString(int val) {
return Integer.toString(val);
}
public static int parseInt(String str) {
return Integer.parseInt(str);
}
}
8.10. Zgłaszanie własnych wyjątków 273
Patrz także
Jak już wspominałem, zamiast klasy MutableInteger można posłużyć się klasą Par-
sePosition. Niemniej jednak klasy MutableInteger można z powodzeniem użyć
także w innych sytuacjach, na przykład doskonale nadaje się ona do stworzenia liczni-
ków wykorzystywanych w serwletach.
8.10. Zgłaszanie własnych wyjątków
Problem
Chcielibyśmy stworzyć i wykorzystać jedną lub kilka klas reprezentujących wyjątki, cha-
rakterystycznych dla danej aplikacji.
RozwiÄ…zanie
Należy zdefiniować klasy potomne klas Exception lub RuntimeException.
Analiza
Teoretycznie rzecz biorąc, można by stworzyć klasę potomną klasy Throwable, niemniej
jednak rozwiązanie takie jest uważane za nieodpowiednie. Zazwyczaj, tworząc własne
wyjątki, definiuje się klasy potomne klasy Exception (jeśli mają to być wyjątki spraw-
dzane) lub klasy RuntimeException (jeśli mają to być wyjątki niesprawdzane). Wyjątki
sprawdzane to takie, które programiści tworzący aplikację muszą przechwytywać i ob-
sługiwać lub  przekazać dalej , podając je w klauzuli throws w definicji metody.
W przypadku tworzenia klas potomnych klas Exception oraz RuntimeException
przyjęło się implementować przynajmniej dwa konstruktory  bezargumentowy oraz
umożliwiający przekazanie jednego łańcucha znaków:
/** A ChessMoveException jest zgłaszany, gdy użytkownik
* wykona nieprawidłowy ruch.
*/
public class ChessMoveException extends Exception {
public ChessMoveException () {
super();
}
public ChessMoveException (String msg) {
super(msg);
}
}
Patrz także
W dokumentacji klasy Exception podano bardzo wiele przykładów jej klas potom-
nych; przed tworzeniem własnych klas wyjątków warto tam zajrzeć i sprawdzić, czy już
nie ma klasy, której można by użyć.
274 Rozdział 8. Techniki obiektowe
8.11. Program Plotter
Program przedstawiony w tej recepturze nie jest złożony, a wręcz przeciwnie  jest
prosty i właśnie dlatego posłuży nam jako przykład prezentujący niektóre zagadnienia
przedstawione w tym rozdziale oraz będzie punktem wyjściowym do dalszych dyskusji.
Przedstawiona klasa opisuje grupę starych (używanych w latach 70-tych i 80-tych) plote-
rów piórowych. Tych, którzy nigdy nie widzieli takiego urządzenia informuję, że ploter
piórowy to urządzenie, które przesuwa specjalne pióro nad kartką papieru, rysując na
niej zadane kształty. Taki ploter jest w stanie podnieść pióro, opuścić je na papier, ryso-
wać odcinki proste, litery i tak dalej. Przed pojawieniem się drukarek laserowych i atra-
mentowych plotery piórowe były najpopularniejszym sposobem przygotowywania
wszelkiego typu wykresów oraz slajdów używanych w prezentacjach (cóż, było to na
długo przed pojawieniem się takich programów jak Harvard Presents oraz Microsoft
Power Point). Aktualnie tylko kilka firm wciąż produkuje plotery piórowe, a jednak
zdecydowałem się podać je jako przykład, gdyż są one na tyle proste, że łatwo można
zrozumieć zasady ich działania nawet na podstawie krótkiego opisu.
Poniżej przedstawiłem klasę wysokiego poziomu, która w abstrakcyjny sposób opisuje
kluczowe cechy ploterów produkowanych przez różne firmy. Można by jej użyć w pro-
gramie analitycznym lub służącym do wyszukiwania danych w celu rysowania koloro-
wych wykresów prezentujących wzajemne związki pomiędzy danymi. Jednak nie chcę,
aby mój program główny musiał zwracać uwagę na wszelkie szczegóły związane obsłu-
gą poszczególnych typów ploterów i z tego powodu klasa Plotter przedstawiona po- [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • dirtyboys.xlx.pl