björn eiderbäck nada, kth email: [email protected] innehåll klassdiagram i mer detalj

47
next previou s Björn Eiderbäck NADA, KTH Email: bjorne @nada. kth .se 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 API September 26, 2001

Upload: nonnie

Post on 07-Jan-2016

32 views

Category:

Documents


2 download

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 Presentation

TRANSCRIPT

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 11

Visibility och Java APIOOMPA, F8

Abstrakta klasser och Interface

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 21

Visibility och Java APIOOMPA, F8

Undantagshantering

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 41

Visibility och Java APIOOMPA, F8

Från UML till kod

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

previous next 47

Visibility och Java APIOOMPA, F8

Javas API och paket• Om vi hinner (tveksamt...) så tittar vi på vad Javas olika

paket kan erbjuda– Grundläggande klasser

– Collections

– Grafik

– Socketar

– RMI

– osv