björn eiderbäck nada, kth email: [email protected] innehåll klassdiagram i mer detalj
DESCRIPTION
Björn Eiderbäck NADA, KTH Email: [email protected] Innehåll Klassdiagram i mer detalj Visibility och modifierare (vilka kommer åt attribut, metoder, osv) Abstrakta klasser och Interface Undantagshantering (Exception handling) Från UML till kod Javas API och paket. - PowerPoint PPT PresentationTRANSCRIPT
nextprevious
Björn EiderbäckNADA, KTH
Email: [email protected]
Innehåll
Klassdiagram i mer detalj
Visibility och modifierare (vilka kommer åt attribut, metoder, osv)
Abstrakta klasser och Interface
Undantagshantering (Exception handling)
Från UML till kod
Javas API och paket
Visibility och Java APISeptember 26, 2001
previous next 2
Visibility och Java APIOOMPA, F8
Klassdiagram (halvrepetition)• Vi kan skriva klassdiagram på en form som anger
parametrar mm
previous next 3
Visibility och Java APIOOMPA, F8
Klassdiagram: notation
Klassnamn
attribut : Typ = initialtVärde
operation(argumentlista) : returTyp
Klassnamn
Klass
GeneraliseringSupertyp
Subtyp1 Subtyp2
superklass (basklass)
subklass (härledd klass)
klassbox, lång form
klassbox, kort form
previous next 4
Visibility och Java APIOOMPA, F8
Klass: attribut• Strukturen av en klass representeras av attribut• Attributen kan hittas genom att utforska
klassdefinitioner, från kravspecifikationen och med hjälp av domänkunskap
CourseOffering
numberlocationtime
Varje kurs har ett nummer, en plats där den genomförs och en tid då den går
Varje kurs har ett nummer, en plats där den genomförs och en tid då den går
previous next 5
Visibility och Java APIOOMPA, F8
Exempel: Klassen Person med två instanser
Person
name : Stringage : Integer
: Personname = Lisa
age = 23
: Personname = Kalle
age = 25
KlassKlass
InstanserInstanser
Rita en klass Person med hjälp ava) ett klassdiagram med attributen name: String och age: Integerb) två instanser av klassen
Rita en klass Person med hjälp ava) ett klassdiagram med attributen name: String och age: Integerb) två instanser av klassen
previous next 6
Visibility och Java APIOOMPA, F8
Exempel: Färgat geometriskt objekt, med defaultvärden
FärgatObjekt
color : Color = rödposition : Point = (10, 10)
geo1: FärgatObjektcolor = röd
position = (10, 10)
geo2: FärgatObjektcolor = röd
position = (30, 50)
defaultvärden
Rita ett klassdiagram med med ett geometriskt objekta) där defaultvärdet för färgen är röd och för positionen är (10, 10)b) "rita" också två instanser
Rita ett klassdiagram med med ett geometriskt objekta) där defaultvärdet för färgen är röd och för positionen är (10, 10)b) "rita" också två instanser
eget namn(frivilligt)
previous next 7
Visibility och Java APIOOMPA, F8
Visibility• Vi kan också ange om attribut och metoder syns utanför
den aktuella klassen
previous next 8
Visibility och Java APIOOMPA, F8
Modifierare
Klassnamn
+publikt_attribut#protected_attribut-privat_attributklassvariabel
+publik_operation()#protected_operation()-privat_operation()klassmetod()
visibility name : type-expression = initial-value { property-string }där visibility någon av:
+ public visibility (dvs alla kan använda det)# protected visibility (dvs endast synlig i klassen eller dess subklasser)- private visibility (endast synlig i klassen)understruken betyder klassmetoder och attribut
om visibility inte sätts ut betyder det bara att den inte visas (inte att denär privat eller publik)
previous next 9
Visibility och Java APIOOMPA, F8
Exempel: modifierare
Person
# name : String# dateOfBirth : Date- pinCode : Integer
+ name() : String+ age() : Integer+ equals(Person) : boolean# name(String)+ create(name : String, dateOfBirth : Date) : Person- hashCode() : Integer
previous next 10
Visibility och Java APIOOMPA, F8
Modifierare i Java• I Java kan vi använda följande modifierare:
– public• kan användas överallt
– protected• kan användas i klass eller subklasser
– private• kan bara användas inne i klassens beskrivning
– static• klassmetod eller klassvariabel
– final• kan ej ändras (variabelfallet), kan ej subklassas (klassfallet)
– abstract• måste specificeras i subklasser
– ingen• package visibility
previous next 12
Visibility och Java APIOOMPA, F8
Abstrakta metoder och klasser• En klass kan deklareras abstrakt
– Då kan inga instanser av klassen skapas
• En klass kan deklarera en eller flera av sina metoder som abstrakta– Då blir också klassen automatiskt abstrakt
• Inga instanser av klassen kan därför skapas
– En subklass blir också abstrakt till dess att alla abstrakta metoder fått en definition
• Tex om metoderna m1() och m2() deklarerats abstrakta i klassen A men subklassen B endast implementerar m1() så är B också abstraktOm en klass C deklareras som subklass till B och implementerar m2() så blir C konkret och kan instansieras
previous next 13
Visibility och Java APIOOMPA, F8
Exempel: abstrakt klass
abstract class GraphicObject{int x, y;
...void moveTo(int newX, int newY)
{...}abstract void draw();
}
class Circle extends GraphicObject
{void draw() {...}
}
class Rectangle extends GraphicObject{
void draw() {...}}
previous next 14
Visibility och Java APIOOMPA, F8
Exempel: abstrakt klasspublic abstract class Shape {
public abstract double area();public abstract double circumference();
}
class Circle extends Shape { protected double r; protected static final
double PI = 3.14; public Circle()
{this(1.0);} public Circle(double r)
{this.r = r;} public double area(
{return PI * r * r;} public double circumference ()
{return 2 * PI * r;}}
class Rectangle extends Shape { protected double w, h; public Rectangle (){this(0.0, 0.0);} public Rectangle (double w, double h)
{this.w = w; this.h = h;}
public double area() {return w * h;}
public double circumference() {return 2 * (w + h);}
}
previous next 15
Visibility och Java APIOOMPA, F8
Vektorer• Deklareras på följande sätt
Typ[] vektor;
• Instansiering (tex)vektor = new Typ[10]
• Kan skapas från primitiva typerint[] tal = new int[5];tal[0] = 2000;Sytem.out.println(tal[0]);
• Kan skapas mer direktPoint[] punkter = {new Point(2, 3),
new Point(56,72)}
previous next 16
Visibility och Java APIOOMPA, F8
...• Så kan vi skapa en vektor av Shapes
Shape[] shapes = new Shape[3];shapes[0] = new Circle(2.0);shapes[1] = new Rectangle(1.0, 2.0);shapes[2] = new Rectangle(10.0, 20.0);
double totalArea = 0;for(int i = 0; i < shapes.length; i++)
total_area += shapes[i].area();
previous next 17
Visibility och Java APIOOMPA, F8
Interface• Ett interface är som en abstrakt klass med enbart abstrakta metoder och
konstanterpublic interface InterfaceX {
public ReturTyp1 m1(X x);public ReturTyp2 m2(Y y);
}• En klass kan deklarera att den implementerar ett eller flera interface
– Observera att en klass endast är direkt subklass till en klass men att den kan implementera flera interfaceclass MinFigur extends Figur implements Interface1,
Interface2 {...}
• Ett interface kan utvidga ett eller flera andra interfacepublic interface InterfaceN extends Interface1,
Interface2,Interface3
{...}
previous next 18
Visibility och Java APIOOMPA, F8
Exempel: interface
public interface Sleeper { public void wakeUp();
public long ONE_SECOND = 1000; public long ONE_MINUTE = 60000;}
public class GUIClock extends Applet implements Sleeper {
. . . public void wakeUp() { repaint(); clock.letMeSleepFor(this, ONE_MINUTE); }}
Konstanter nås viaInterfacenamn.konstant
tex Sleeper.One_Second
previous next 19
Visibility och Java APIOOMPA, F8
..med interface med följande definitioner...
public interface Drawable{public void setColor(Color c);public void setPosition(Point p);public void draw(Window dw);
}
public DrawableRectangle extends Rectangle implements Drawable{
private Color c;private Point pos;public void setColor(Color c)
{this.c = c};public void setPosition(Point p)
{pos = p;}public void draw(Window dw)
{dw.drawRect(pos.x, pos.y, height, width);}}
Rectangle
previous next 20
Visibility och Java APIOOMPA, F8
... så kan vi konstruera en vektor av interface
Drawable[] drawables = new Drawable[3];drawables[0] = new DrawableCircle(2.0);drawables[1] = new DrawableSquare(20.0);drawables[2] = new DrawableRectangle(10.0, 20.0);
for(int i = 0; i < drawables.length; i++){drawables[i].setPosition(i * 10.0, i * 5.0);drawables[i].draw(myWindow);
}
(Givet att vi också konstruerat enDrawableCircle och en DrawableSquare på motsvarande sätt)
previous next 22
Visibility och Java APIOOMPA, F8
Undantagshantering (eng. Exception handling)• Java är från början konstruerat med insikten om att fel
uppkommer-ofta oväntade fel
• Programmeraren skall alltid vara beredd att hantera ett fel
• Därför ingår undantagshantering som en grundläggande mekanism i Java
• En "exception" är en händelse som "stör" det normala programflödet och hindrar programmet från att fortsätta
• Undantag kan vara av två olika modeller:– terminerande, dvs vi kan inte fortsätta från den punkt felet uppstod utan
att åter anropa metoden som resulterade i felet
– återupptagbar, vi kan fortsätta från avbrottspunkten (eventuellt med vissa data förändrade i felhanteringen)
Java använder en terminerande modellJava använder en terminerande modell
previous next 23
Visibility och Java APIOOMPA, F8
Exceptions• Hanterar situationer då fel har uppstått
• Kan orsakas av fel koden inte klarar av att exekvera– tex division med noll
• eller okontrollerbara fel hos externa enheter– tex filsystemet har gått ner eller annat fel i filhantering
• Om något går fel– systemet signalerar ett avbrottsobjekt
– Avbrottsobjektet letar sig upp i anropsstacken tills dess att en hanterare för det aktuella felet hittas.
try {//"normal" kod}catch(Feltyp e) {//kod för att hantera felet}try {//"normal" kod}catch(Feltyp e) {//kod för att hantera felet}
previous next 24
Visibility och Java APIOOMPA, F8
Konsekvenser• Genom att använda exceptions kan vi först fokusera på
att skriva koden för normalfallet– Först sedan tar vi hand om olika fel
• Vi kan också (uniformt) hantera fel av grundläggande karaktär eller som sker i systemobjekt, som den virtuella maskinen
• Ett fel som uppstår i en del av koden kan hanteras i en annan (där man förmodligen bättre vet hur lämplig hantering skall gå till)
• Ett alternativ är att returnera null och sedan låta anropande rutin testa för detta fel– men vad händer om vi verkligen vill använda null som ett
möjligt värde/resultat?
previous next 25
Visibility och Java APIOOMPA, F8
Javas exceptions• I Java kan en metod deklarera att den "kastar" ett exception
• Användare av en sådan metod kan inte "glömma" att ta hand om ett sådant undantag utan är tvingade att skriva kod som hanterar felsituationen
• Tar man inte hand om undantaget så säger kompilatorn ifrån
try{ //kod som använder metod som kastar
AktuelltUndantag}
catch(AktuellUndantag e){}
try{ //kod som använder metod som kastar
AktuelltUndantag}
catch(AktuellUndantag e){}
public void m() throws AktuelltUndantag {…}public void m() throws AktuelltUndantag {…}
previous next 26
Visibility och Java APIOOMPA, F8
Exempel: fånga IOExceptiontry
{
File f = new File("exceptiontest1.result");
FileWriter w = new FileWriter(f);
PrintWriter out = new PrintWriter(w);
out.println("Det blev inga fel!");
out.println();
out.close();
}
catch(IOException e)
{
System.err.println("Fel i filhantering");
}
previous next 27
Visibility och Java APIOOMPA, F8
Exempel: aritmetiskt fel int res, a = 10, b = 0;
try
{
res = a / b;
}
catch(ArithmeticException e)
{
out.println(e);
res = 1;
}
out.println("Efter felhantering är res: " + res);
previous next 28
Visibility och Java APIOOMPA, F8
... kan också fångas via generellare Exceptiontry
{res = a / b;
}catch(Exception e)
{out.println(e); // skriv ut info om felet
res = 100;}
out.println("Efter felhantering är res: " + res);}
• ArithmeticException subklass till RuntimeException som är subklass till Exception
previous next 29
Visibility och Java APIOOMPA, F8
Felsignalerna bildar en hierarkiThrowable
ErrorLinkageError
IncompatibleClassChangeErrorInstantiationError
VirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowError
ExceptionIllegalAccessExceptionIOException
EOFExceptionFileNotFoundExceptionInterruptedIOExceptionMalformedURLException
RuntimeExceptionArithmeticExceptionClassCastExceptionEmptyStackExceptionIndexOutOfBoundsException
ArrayIndexOutOfBoundsException
StringIndexOutOfBoundsExceptionNegativeArraySizeExceptionNullPointerExceptionSecurityException
previous next 30
Visibility och Java APIOOMPA, F8
Skapa och signalera fel• Ny egen exception skapas som subklass till klassen Exception
• Signalera fel med meddelandet throw
throw new MyException()throw new MyException()
public class MyException extends Exception {public MyException() {super();} public MyException(String s) {super(s);}
}
public class MyException extends Exception {public MyException() {super();} public MyException(String s) {super(s);}
}
previous next 31
Visibility och Java APIOOMPA, F8
Exempel: throwpackage java.util
public class Stack extends Vector {
public Object push(Object item)
{addElement(item);
return item;}
...
public synchronized Object peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
...
previous next 32
Visibility och Java APIOOMPA, F8
Fånga flera fel• Vi kan fånga flera olika fel genom:
• Vi kan använda finally om vi alltid vill utföra ett kodblock
try{öppna fil}catch(SomeException e) {felhantering}finally{fil.close()}
try{...}catch(ExceptionOne e1) {}catch(ExceptionTwo e2) {}catch(ExceptionThree e3) {}
try{...}catch(ExceptionOne e1) {}catch(ExceptionTwo e2) {}catch(ExceptionThree e3) {}
try{...}catch(SomeException e) {}finally {//Gör alltid detta}
try{...}catch(SomeException e) {}finally {//Gör alltid detta}
previous next 33
Visibility och Java APIOOMPA, F8
Fler exempeltry {
int a[] = new int[2];
a[4];
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("exception: " + e.getMessage());
e.printStackTrace();
}Argumentet
givet då undantagetkastades
Skriv information omfelet på System.err
previous next 34
Visibility och Java APIOOMPA, F8
Deklarera att ett exception kastas• Vi kan i en metod deklarera att ett exception kastas
• Eller flera samtidigt
public void myOpenFile() throws IOException {...}public void myOpenFile() throws IOException {...}
public File search(String s) throws IOException, MyException1, MyException2 {...}public File search(String s) throws IOException, MyException1, MyException2 {...}
previous next 35
Visibility och Java APIOOMPA, F8
Vissa exceptions behöver man inte ta hand om, om man inte vill
• Av praktiska skäl behöver man inte ta hand om exceptions som är subklasser till– Error– RuntimeException
• Annars skulle man behöva ha exceptionhandling överallt– Varför?
previous next 36
Visibility och Java APIOOMPA, F8
Exempel: Throwtest// Några egna Exceptions.
class MyException extends Exception {
public MyException() {super(); }
public MyException(String s) {super(s);}
}
class MyOtherException extends Exception {
public MyOtherException() { super(); }
public MyOtherException(String s) {super(s);}
}
class MySubException extends MyException {
public MySubException() { super(); }
public MySubException(String s) {super(s);}
}
previous next 37
Visibility och Java APIOOMPA, F8
...public class throwtest {
public static void main(String argv[]) { int i;
try {i = Integer.parseInt(argv[0]);
}catch (ArrayIndexOutOfBoundsException e) { // argv är
tomSystem.out.println("Must specify an argument");return;
}catch (NumberFormatException e) { // argv[0] inte ett
heltalSystem.out.println("Must specify an integer
argument.");return;
}a(i);
}
previous next 38
Visibility och Java APIOOMPA, F8
...// Anropa b(), som är deklarerad att kasta ett visst exception.
// Vi hanterar detta exception.
public static void a(int i) {
try {
b(i);
}
catch (MyException e) { // Point 1.
// Vi hanterar MyException och dess subklass MyOtherException
if (e instanceof MySubException)
System.out.print("MySubException: ");
else
System.out.print("MyException: ");
System.out.println(e.getMessage());
System.out.println("Handled at point 1");
}
}
previous next 39
Visibility och Java APIOOMPA, F8
…finally
public static void b(int i) throws MyException {int result;try {
System.out.print("i = " + i);result = c(i);System.out.print(" c(i) = " + result);
}catch (MyOtherException e){ //Point 2
System.out.println("MyOtherException: " + e.getMessage());
System.out.println("Handled at point 2");}finally {
// Gör alltid en radframmatning.System.out.print("\n");
}}
previous next 40
Visibility och Java APIOOMPA, F8
...
public static int c(int i) throws MyException, MyOtherException {
switch (i) {
case 0:
throw new MyException("input too low");
case 1:
throw new MySubException("input still too low");
case 99:
throw new MyOtherException("input too high");
default:
return i*i;
}
}VARNING!
Case-satser bör egentligen undvikas i OO
VARNING!Case-satser bör egentligen undvikas i OO
previous next 42
Visibility och Java APIOOMPA, F8
Exempel på UML och Java (från Fii): lampa
Light1
# isOn : boolean
+ turnOn() : void+ turnOff() : void+ isOn() : boolean+ toggle() : void+ main(String []) : void
onoff
toggle
toggle
previous next 43
Visibility och Java APIOOMPA, F8
… Light1, Javakodpublic class Light1 {
protected boolean isOn;public void turnOn() {isOn = true;}public void turnOff() {isOn = false;}public boolean isOn() {return isOn;}public void toggle() {isOn = !isOn();}
public static void main (String args[]) {Light1 light;light = new Light1();System.out.println(light.isOn()); //ska ge falselight.toggle();System.out.println(light.isOn()); // ska ge true
}}
previous next 44
Visibility och Java APIOOMPA, F8
Exempel: lampa2, med start i on-läge
onoff
toggle
toggle
previous next 45
Visibility och Java APIOOMPA, F8
... Light2, Javakodpublic class Light2 {
// defultvärde för isOn kan anges vid deklarationen
protected boolean isOn = true;
// medlemsmetoderna som förut...
public static void main (String args[]) {
Light2 light;
light = new Light2();
System.out.println(light2.isOn()); //true
light.toggle();
System.out.println(light.isOn()); //false
}
}
previous next 46
Visibility och Java APIOOMPA, F8
Fler exempel på UML till kod• Vi ”översätter” diagram från tidigare föreläsningar till
kod
• Vi tittar speciellt på klass-, sekvens- och samarbetsdiagram från föreläsning 5