...
Sett utenifra kan en se på hovedprogramklasser som tjenesteorienterte, siden de ofte inneholder spesifikke metoder som aktivere kalles på bestemte tidspunkt, f.eks. ved oppstart og avslutning av applikasjonen og ved evt. andre vesentlige hendelser. Akkurat hvilke metoder dette er, er avhengig av typen applikasjon og rammeverket systemet som systemet applikasjonen er bygget med/ifor. Eksempler kan være:
- Enkle java-programmer: Metoden som kalles er ikke en vanlig instansmetode som trenger et objekt, men en metode med signaturen public static void main(String[] args). Denne instansierer det egentlige hovedprogramobjektet og kaller metoder som init() og run() (se eksempel nedenfor).
- Applets (Java-app'er integrert i nettsider): Klassen er en Applet og metodene som kalles er init() (én gang ved lasting av siden), start() (ved oppstart) og stop() (ved avslutning).
- Nettapplikasjoner: Klassen er av typen (arver fra) Servlet og metodene som kalles er init() (én gang ved initialisering), service(...) (kalles for hvert anrop, f.eks. get eller post) og destroy() (én gang ved avslutning). Standard-implementasjonen av service(...) kaller metoder som doGet(...) og doPost(...).Android-app'er: Klassen er av typen (arver fra) Activity, og metodene som kalles er onCreate (én gang ved oppstart), onStart() (ved oppstart og gjennoppstarting), onPause() (når en annen app legger seg i forgrunnen), onResume() (når app'en komme i forgrunnen igjen), onStop() (ved avslutning, enten av bruker eller system), onRestart() (bruker gjennoppstarting app'en) og onDestroy() (kan app'en drepes).
- Eclipse-plugin (editor eller view)panel: Klassen er av typen IWorkBenchpart (typisk EditorPart eller ViewPart) IViewPart og metodene som kalles er init(...) (ved opprettelse), createPartControl(...) (når innholdet skal integreres i Eclipse-vinduetlager panel-innholdet), setFocus() (når innholdet skal aktiverespanelet er vist frem) og dispose() (når editoren eller view'et panelet lukkes)....
- Android-app'er:
Image Added
Poenget er ikke at en Java-programmerer må lære seg alle varianter, det vesentlige er å forstå at en hovedprogramklassen hovedprogramklass som regel inngår i et større system som styrer opprettelsen oppretter en instans av klassen og kaller forhåndsdefinerte metoder på bestemte tidspunkt i applikasjonens livssyklus, typisk oppstart, aktivering og avslutning. Et eksempel på en slik livssyklus er Android-aktiviteter (nummer tre i lista over):
Image Removed
Anchor |
---|
| mainprogramklasse |
---|
| mainprogramklasse |
---|
|
Dersom en lager enkle Java-applikasjoner av den første typen, så har ingen så klare regler som følger dette mønsteret, men det er en god idé fordi det gjør applikasjonen ryddigere og lettere å gjøre om til andre typer senere. Anta f.eks. at en skal lage en enkel kalkulator som skal styres med enkel tekstinput. Kalkulator-logikken håndteres av et
tjenesteorientert objekt som brukes av hovedprogrammet på ulike måter avhengig av hva brukeren gjør. I tabellen under
er klassene vist som et klassediagram, objektstrukturen med disse to objektene vist som et
objektdiagram, samspillet vist som et
sekvensdiagram og tilstanden til kalkulatorobjektet som et
objekttilstandsdiagram .
Klassediagram | Objektdiagram | Sekvensdiagram | Objekttilstandsdiagram |
---|
PlantUML Macro |
---|
class "CalculatorProgram" as hovedprogram {
init()
run()
stop()
}
class "Calculator" as kalkulator {
-double value
+double getValue()
+void setValue(double)
+double add(double)
+double subtract(double)
+double multiply(double)
+double divide(double)
}
hovedprogram --> kalkulator: calculator |
| PlantUML Macro |
---|
object CalculatorProgram {
}
object Calculator {
value = 0.0
}
CalculatorProgram --> Calculator: calculator |
| PlantUML Macro |
---|
control main
actor User
control main
main -> CalculatorProgram : init()
main -> CalculatorProgram : run()
User -> CalculatorProgram : "1.0"
CalculatorProgram -> Calculator: setValue(1.0)
CalculatorProgram -> User: "1.0"
User -> CalculatorProgram: "+ 2.0"
CalculatorProgram -> Calculator: add(2.0)
CalculatorProgram -> User: "3.0"
User -> CalculatorProgram: "* 3.0"
CalculatorProgram -> Calculator: multiply(3.0)
CalculatorProgram -> User: "9.0"
main -> CalculatorProgram : stop() |
| PlantUML Macro |
---|
object "Calculator" as calculator1 {
value = 0.0
}
object "Calculator" as calculator2 {
value = 1.0
}
calculator1 -down-> calculator2: setValue(1.0)
object "Calculator" as calculator3 {
value = 3.0
}
calculator2 -down-> calculator3: add(2.0)
object "Calculator" as calculator4 {
value = 9.0
}
calculator3 -down-> calculator4: multiply(3.0) |
|
...