Videregående programmering i Java af Jacob Nordfalk

Indholdsfortegnelse

0 Forord 15

0.1 Formål og indhold 15

0.1.1 Bogens opbygning og indhold 15

0.2 Forudsætninger for at læse bogen 17

0.2.1 UML: Klassediagrammer 17

0.3 Netudgaven af bogen 18

0.4 Åben Dokumentlicens (ÅDL) 19

0.5 Tak 20

Første del: Videregående Java


1 Samlinger af data 23

1.1 Lister og mængder 24

1.1.1 De simple typer og samlinger af data 25

1.1.2 Interfacene til lister og mængder 25

1.1.3 Lister 26

1.1.4 Mængder 26

1.1.5 Iteratorer 27

1.2 Afbildninger (nøgleindekserede lister) 28

1.2.1 Afbildninger (Interfacet Map) 28

1.2.2 Hashtabeller (klassen HashMap) 29

1.2.3 Eksempel - ordbog 29

1.2.4 Eksempel - fødselsdatoer 30

1.2.5 Klassen LinkedHashMap 31

1.2.6 Interfacet SortedMap (sorterede afbildninger) og klassen TreeMap 31

1.3 Opgaver 31

1.4 Videre læsning 31

1.5 Appendiks 32

1.5.1 Collection 32

1.5.2 Set 32

1.5.3 SortedSet 32

1.5.4 List 33

1.5.5 Map 34

1.5.6 Iteratorer 35

1.5.7 Manipulation og sortering af data 36

1.6 Avanceret 38

1.6.1 Store-O-notationen 38

1.6.2 Arraybaserede listers virkemåde 38

1.6.3 Hægtede listers virkemåde 39

1.6.4 Hashtabellers virkemåde 39

1.6.5 Søgetræers virkemåde 39

1.6.6 Uforanderlige samlinger 40

1.6.7 Trådsikre samlinger 40

1.6.8 Uddrag af kildeteksten til Vector-klassen 41

2 Dokumentation 45

2.1 Javadoc 46

2.1.1 API-dokumentation 46

2.1.2 At dokumentere med javadoc 47

2.1.3 Simpelt eksempel 47

2.1.4 Større eksempel: Vector-klassen 48

2.1.5 Oversigter 49

2.2 Kørsel af javadoc 50

2.2.1 Simpel brug 50

2.2.2 Henvise til den eksisterende javadokumentation 50

2.3 Appendiks 51

2.3.1 Parametre til javadoc 51

2.3.2 Koder tilgængelige i javadoc 52

2.3.3 Pakkekommentarer 52

2.4 Videre læsning 53

2.5 Opgaver 53

2.6 Løsninger 54

3 Rekursion 55

3.1 Introduktion til rekursive algoritmer 56

3.1.1 Folde en rekursion ud 56

3.1.2 Forudsætninger for rekursion 56

3.2 Rekursiv listning af filer 57

3.3 Beregning af et matematisk udtryk 58

3.4 Tegning af fraktaler 60

3.5 Opgaver 61


4 Komponentbaseret programmering 63

4.1 Genbrugelige komponenter 64

4.1.1 Javabønner 64

4.1.2 Eksempel: Bønnen TextField 64

4.1.3 Bruge en javabønne 65

4.2 At definere javabønner 67

4.2.1 En meget simpel bønne: GentagTekst 67

4.2.2 Brug af bønner fra et udviklingsværktøj 68

4.2.3 Størrelsen af en grafisk komponent 68

4.2.4 Skelne mellem udviklings- og i kørselsfasen 69

4.3 Karakteristika ved javabønner 70

4.3.1 Bønner skal have en parameterløs konstruktør 70

4.3.2 Bønner kan have egenskaber 70

4.3.3 Bønner kan have tilknyttet ekstra information 71

4.3.4 Bønner bør være afgrænsede og uafhængige 71

4.3.5 Bønner kan understøtte hændelses-lyttere 71

4.4 Ekstra eksempler 73

4.4.1 Rystetekst 73

4.4.2 Rulletekst 74

4.4.3 Simpel kryptering 75

4.4.4 Eksempel på brug af bønnerne i et værktøj 76

4.5 Opgaver 78

4.6 Løsninger 79

4.6.1 Grafisk komponent: GentagTekst 79

4.6.2 Grafisk komponent: Billede 79

4.6.3 Webserver-komponent 80

4.7 Avanceret 81

4.7.1 En komponent til at tegne kurver 81

4.7.2 Repræsentation af funktioner 84

4.7.3 Fortolkning af strenge til funktioner 86

4.7.4 Layout-manageres virkemåde 87

4.7.5 Øvelse: Samspil med layout-manager 88

4.7.6 Opgave: Adresseindtastningskomponent 88

4.7.7 Løsning: Adresseindtastningskomponent 89


5 Grafiktegning (Java2D) 93

5.1 Java2D kort fortalt 94

5.1.1 Geometriske figurer 94

5.1.2 Geometriske operationer 95

5.1.3 Transformationer 96

5.1.4 Linjetyper 96

5.1.5 Tegnekvalitet 96

5.1.6 Videre læsning 96

5.2 Eksempel 96

5.3 Eksempel fra JDK'et 98

6 Grafiske brugergrænseflader (Swing) 99

6.1 Introduktion til Swing 100

6.1.1 Eksempel på forskelle mellem Swing og AWT 101

6.2 MVC i Swing- og AWT-komponenter 102

6.2.1 AWT-komponenter 102

6.2.2 Swing-komponenter 102

6.3 Datamodellen i Swing-komponenter 103

6.3.1 Tekstfelter (interfacet Document) 103

6.3.2 Tabeller (interfacet TableModel) 104

6.3.3 Knapper (interfacet ButtonModel) 105

6.3.4 Andre komponenter 106

6.3.5 Opgaver 106

6.3.6 Løsning 107

6.4 Præsentationsdelen i Swing 110

6.4.1 Lister (ListCellRenderer) 110

6.4.2 Eksempel: Præsentation af skrifter i en liste 111

6.4.3 Tabeller (TableCellRenderer) 113

6.4.4 Træer (TreeCellRenderer) 114

6.4.5 Opgaver 114

6.5 Kontroldelen af Swing-komponenter 115

6.5.1 Tabeller (TableCellEditor) 115

6.5.2 Træer (TreeCellEditor) 115

6.5.3 Standardredigering med DefaultCellEditor 115

6.6 Eksempler 116

6.6.1 SwingSet2-demo af JTable 116

6.6.2 Eksempel med JTable 117

6.7 Avanceret: Udseendet af Swing 119

6.7.1 Swing-komponenters standardudseender 119

6.7.2 Andre udseender 119

6.7.3 Kunststoff-udseendet 119

6.7.4 Alloys-udseendet 120

6.7.5 Opgaver 120

7 Internationalisering 121

7.1 Internationale programmer 122

7.1.1 Formatering af tidspunkter 122

7.1.2 Formatering af tal og beløb 123

7.1.3 Tekstindhold i resursefiler 123

7.1.4 Avanceret: Binære resursefiler 124

7.1.5 Avanceret tekstformatering 125

7.2 Selv bestemme sproget 127

7.2.1 Styre sproget fra kommandolinjen 127

7.2.2 De mulige Locale-objekter 127

7.2.3 Bruge Locale-objekter 128

7.2.4 Avanceret: Sætte standardsprog 128

8 Databaser (JDBC) 129

8.1 Basisfunktioner i JDBC 130

8.1.1 Indlæse driveren 130

8.1.2 Etablere forbindelsen 130

8.1.3 Kommunikere med databasen 131

8.2 Forpligtigende eller ej? (commit) 132

8.3 Optimering 133

8.3.1 Bruge den rigtige databasedriver 133

8.3.2 Lægge opdateringer i kø (batch-opdateringer) 133

8.3.3 På forhånd forberedt SQL 134

8.3.4 Kalde gemte procedurer i databasen 135

8.4 Avanceret 136

8.4.1 Opdatering og navigering i ResultSet-objekter 136

8.4.2 Metadata 136

8.4.3 Metadata om databasen 136

8.4.4 Metadata om svaret på en forespørgsel 136

8.4.5 Eksempel - udskrive en vilkårlig tabel 137

8.4.6 Persistering af objekter - JDO 138

9 Optimering 139

9.1 Optimering 140

9.2 Ting, man skal undgå (hvis man kan) 140

9.2.1 Oprette mange objekter 140

9.2.2 Oprette mange tråde 141

9.2.3 Kaste og fange mange undtagelser 141

9.2.4 Gå ind og ud af synkroniserede blokke/metoder 141

9.2.5 Bruge mange (evt. anonyme) klasser 141


9.3 Er C++ hurtigere end Java? 142

9.3.1 Et testprogram i Java 143

9.3.2 Testprogrammet i C++ 143

9.4 Videre læsning 144

10 Eksterne kald og JNI 145

10.1 Kalde eksterne programmer 146

10.1.1 Kommunikation med det eksterne program 147

10.2 Kald til andre programmeringssprog 147

10.2.1 JNI - Java Native Interface 147

10.2.2 Skrive Java-klasser med maskinkode 147

10.2.3 Skrive en metode i C++ 148

10.2.4 Oversætte til maskinkode 149

10.2.5 Køre programmet 149

10.2.6 Kommunikation fra C-koden til Java 150

10.2.7 Henvisninger 150

11 Introspektion 151

11.1 Læse klasseinformation for et objekt 152

11.1.1 Oversigt over pakken java.lang.reflect 152

11.1.2 Opremse metoderne i en klasse 153

11.2 Arbejde med objekter 153

11.3 Introspektion på javabønner 154

11.4 Generere nye klasser og indlæse dem 155

11.4.1 Kalde oversætteren som eksternt program 155

11.4.2 Bruge oversætteren internt 155

11.4.3 Indlæse klasser fra filsystemet 156

11.5 Videre læsning 157

12 Standardbiblioteket (J2SE) 159

12.1 Grundlæggende klasser (java.lang) 160

12.1.1 Klasser, der svarer til de simple typer 160

12.1.2 Tråde 161

12.1.3 Introspektion og dynamisk klasseindlæsning 161

12.1.4 Svage referencer (java.lang.ref) 162

12.1.5 Matematik med vilkårlig præcision (java.math) 162

12.2 Værktøjsklasser (java.util) 162

12.2.1 De "klassiske" datastrukturer i java.util 163

12.2.2 Collections-klasserne i java.util 164

12.3 Behandling af tekst (java.text) 165


12.4 Grafiktegning (java.awt del 1) 166

12.4.1 Generelt 166

12.4.2 Grafiktegning (Java2D) 167

12.4.3 Udskrivning 169

12.5 Grafiske brugergrænseflader (java.awt del 2) 170

12.5.1 Grafiske komponenter i java.awt 170

12.5.2 Containere i java.awt 171

12.5.3 Appletter (pakken java.applet) 171

12.5.4 Layout-managere i java.awt 171

12.5.5 Hændelser i java.awt 171

12.5.6 Menuer i java.awt 173

12.5.7 Kopiering, udklipsholder og træk-og-slip 173

12.6 Lyd 174

12.6.1 WAV/indspillet lyd (javax.sound.sampled) 174

12.6.2 MIDI/nodebaseret musik (javax.sound.midi) 175

12.7 Netværkskommunikation (java.net) 177

12.8 Databasekommunikation (java.sql) 178

12.9 Fjernkald af metoder (java.rmi) 179

12.10 Sikkerhed, kryptering, adgangskontrol (java.security) 180

13 Mobiltelefoner (J2ME) 181

13.1 Introduktion til midletter 182

13.1.1 Eksempel - en simpel midlet 182

13.1.2 Prøvekøre en midlet 182

13.1.3 Midletters livscyklus 183

13.2 Brugergrænseflader i midletter 184

13.2.1 Klassen Display (den fysiske skærm) 184

13.2.2 Klassen Displayable (skærmbilleder) 185

13.2.3 Klassen Ticker (rulletekst på et skærmbillede) 185

13.2.4 Klassen Image (billeder) 185

13.2.5 Klassen Font (skrifttyper) 186

13.3 Direkte grafiktegning og spil 187

13.3.1 Klassen Canvas 188

13.3.2 Klassen GameCanvas og lagdelt grafik 188

13.3.3 Klassen Graphics 189

13.4 Grafiske standardkomponenter 190

13.4.1 Eksempel: Gæt et tal 190

13.4.2 Kommandoer og hændelser i midletter 191

13.4.3 TextBox 192

13.4.4 Alert 192

13.4.5 List 193

13.4.6 Form 194

13.5 Tilgængelige klasser fra J2SE 195

13.5.1 Pakken java.lang 195

13.5.2 Pakken java.util 195

13.5.3 Pakken java.io 195

13.6 Netværkskommunikation 196

13.6.1 Pakken javax.microedition.io 196

13.6.2 Eksempel: Kommunikation med webserver 197

13.7 Gemme data i telefonen 199

13.8 Udviklingsværktøjer til midletter 200

13.8.1 Wireless Toolkit 200

13.8.2 Sun ONE Studio Mobile Edition 200

13.8.3 Borland JBuilder MobileSet 201

13.9 Opbygningen af J2ME 202

13.9.1 Konfigurationer 202

13.9.2 Profiler 203

13.10 Yderligere læsning 203

14 Servere (J2EE & EJB) 205

14.1 J2EE-platformens dele 206

14.2 Webservere (servletter og JSP) 206

14.2.1 JSP-sider 206

14.2.2 HTML-formularer 207

14.3 RMI - objekter over netværk 208

14.3.1 Principper i kald over et netværk 208

14.3.2 Fjerninterfacet til serverobjektet 208

14.3.3 Implementationen af serverobjektet 209

14.3.4 Klientsiden - brug af fjerninterfacet 210

14.4 EJB-bønner 211

14.4.1 Kildeteksten i en bønne 211

14.4.2 Eksempel: Veksler 211

14.4.3 EJB-Containerens information om Veksler 212

14.5 Bruge en EJB-bønne 213

14.5.1 JNDI (Java Naming and Directory Interface) 213

14.5.2 Brug af Veksler-bønnen 213

14.5.3 Brug af Veksler fra JSP 214

14.6 Typer af EJB-bønner 214

14.6.1 Sessionsbønner 214

14.6.2 Entitetsbønner 215

14.6.3 Meddelelses-drevne bønner 215

14.6.4 Tilstandsfuld sessionsbønne: Brugeradgang 215

14.6.5 Opgaver 216


14.7 Entitetsbønner 217

14.7.1 Eksempel på en entitetsbønne 217

14.7.2 Fremfindingsmetoder 217

14.7.3 Idriftsætte bønnen 219

14.7.4 Bruge bønnen 220

14.7.5 Fremfinde entitetsbønner i EJB 1.1 220

14.7.6 EJB 2.0 og EJB Query language (EJBQL) 221

14.7.7 Opgaver 222

14.8 Transaktioner 223

14.8.1 JTS (Java Transaction Service) 223

14.8.2 Transaktioner i JDBC (resumé) 223

14.8.3 Transaktioner i en EJB-container 223

14.8.4 Deklarativ transaktionsstyring af metodekald 224

Anden del: Videregående objektorienteret programmering


15 Videregående OOP 227

15.1 Arv 228

15.1.1 Holdninger til arv 228

15.1.2 Modstrid mellem holdningerne 228

15.1.3 Øvelse 231

15.1.4 Nedarvinger, hvor funktionaliteten ikke udvides, men begrænses 231

15.2 Delegering (i stedet for arv) 232

15.2.1 At skjule nogle metoder 232

15.2.2 Modellering af roller 234

15.2.3 Resumé og konklusion 236

15.3 Specificér funktionalitet i et interface 236

15.3.1 Repetition af interfaces 236

15.3.2 Eksempel: Stak 237

15.3.3 Eksempel: Collections-klasserne 238

15.4 Konstanterklæringer i et interface 239

15.5 Markeringsinterface 239

15.6 Ansvarsområder 240

15.6.1 Eksempel på tildeling af ansvarsområder 240

15.6.2 Ekspert 242

15.6.3 Skaber 242


15.7 Lav kobling og høj kohæsion 243

15.7.1 Lav kobling 243

15.7.2 Høj kohæsion 243

15.7.3 Indkapsling 244

15.7.4 Indkapsling og pakker 244

15.8 GRASP 245

15.9 Introduktion til designmønstre 245

15.9.1 Designmønstre berørt i de følgende kapitler 245

16 Skabende designmønstre 247

16.1 Overordnet idé 248

16.1.1 Fabrikeringsmetoder 248

16.2 Fabrik 249

16.2.1 Eksempel: Image 249

16.3 Singleton 250

16.3.1 Eksempel: java.lang.Runtime 250

16.3.2 Eksempel: java.awt.Toolkit 250

16.3.3 Eksempel: Dataforbindelse 251

16.3.4 Singleton med sen initialisering 252

16.3.5 Singleton uden privat konstruktør 253

16.4 Abstrakt Fabrik 254

16.4.1 Eksempel: AdresseFabrik 254

16.4.2 Eksempel fra standardklasserne: AWT 256

16.5 Bygmester 257

16.5.1 Trinvis konstruktion 257

16.5.2 Eksempel på trinvis konstruktion: E-post 258

16.5.3 Eksempel på netværk af objekter: Funktioner 258

16.6 Prototype 259

16.6.1 Interfacet Cloneable 259

16.6.2 Overfladisk og dyb kopiering 259

16.6.3 Eksempel: Et tegneprogram 260

16.7 Objektpulje 262

16.7.1 Eksempel: Begrænsede resurser 262

16.7.2 Variation: Klient 'hænger', hvis puljen løber tør 263

16.7.3 Genbrug af tråde 264

16.7.4 Opgave: Objektpulje med objektfabrik 265

16.8 Større eksempel: Dataforbindelse 266

16.8.1 Specialiseringer af Dataforbindelse 267

16.8.2 Dataforbindelse over netværk 269

16.8.3 Dataforbindelse, der cacher forespørgsler 271

16.8.4 Endelig udgave af Dataforbindelse 272


17 Hyppigt anvendte designmønstre 273

17.1 Proxy 274

17.1.1 Simpelt eksempel: En stak, der logger kaldene 274

17.1.2 Variationer af designmønstret Proxy 275

17.1.3 Eksempel: Gøre data uforanderlige vha. Proxy 276

17.1.4 Doven Initialisering/Virtuel Proxy 277

17.1.5 Eksempel på Virtuel Proxy: En stak der først oprettes, når den skal bruges 277

17.2 Adapter 278

17.2.1 Simpelt eksempel 278

17.2.2 Anonyme klasser som adaptere 279

17.2.3 Anonyme adaptere til at lytte efter hændelser 280

17.2.4 Eksempel: Få data til at passe ind i en JTable 281

17.2.5 Ikke-eksempel: Adapter-klasserne 282

17.3 Iterator 283

17.3.1 Iteratorer i Collections-klasserne 283

17.3.2 Definere sin egen form for iterator 284

17.3.3 Iteratorer i JDBC 284

17.3.4 Iterator til at gennemløbe geometriske figurer 285

17.4 Facade 286

17.4.1 Eksempel: URL 286

17.4.2 Eksempel: Socket og ServerSocket 286

17.5 Observatør/Lytter 287

17.5.1 Eksempel: Hændelser 287

17.5.2 Eksempel: Kalender 288

17.6 Dynamisk Binding 289

17.6.1 JDBC og Dynamisk Binding 290

17.6.2 Eksempel: Fortolkning af matematikfunktioner 292

17.7 Opgaver 293

17.8 Løsninger 294

17.8.1 Dataforbindelseslogger 294

17.8.2 Designmønstre i JDBC 294

18 Andre designmønstre 295

18.1 Uforanderligt objekt (Immutable) 296

18.1.1 Uforanderlige objekter i standardbiblioteket 296

18.1.2 Eksempel - en uforanderlig punkt-klasse 297

18.1.3 Opgave 297

18.2 Fluevægt 298

18.2.1 Eksempel: Strenge 298

18.2.2 Eksempel: Dele UforanderligtPunkt-objekter 299

18.3 Filter 300

18.3.1 Eksempel: Kunde-filtre 300

18.3.2 Eksempel: Streng-filtre 302

18.3.3 Opgave 304

18.3.4 Eksempel: Output- og InputStream-klasserne 304

18.3.5 Avanceret: Læse vs. skrive data 306

18.4 Lagdelt Initialisering 307

18.4.1 Simpelt eksempel 307

18.4.2 Lagdelt initialisering vs. fabrikeringsmetode 307

18.4.3 Eksempel: URL-klassen 308

18.4.4 Avanceret lagdelt initialisering 308

18.4.5 Avanceret lagdelt initialisering og dynamisk binding i URL-klassen 308

18.5 Komposit/Rekursiv komposition 309

18.5.1 Analogi til byggeindustrien 309

18.5.2 Eksempel: Component/Container 312

18.5.3 Eksempel: Funktioner 313

18.6 Kommando 314

18.6.1 Eksempel 314

18.6.2 Avanceret: Variationer af designmønstret 316

18.6.3 Opgaver 316

18.7 Opgave: Designmønstre i standardbibliotekerne 317

18.7.1 Løsning: Designmønstre i standardbiblioteket 318

19 Model-View-Controller-arkitekturen 319

19.1 De tre dele af MVC 320

19.1.1 Modellen 320

19.1.2 Præsentationen 320

19.1.3 Kontrol-delen 321

19.2 Relationer mellem delene 321

19.2.1 Informationsstrøm gennem MVC 321

19.2.2 Opdatering af præsentationen - tre muligheder 322

19.2.3 A - Præsentationer undersøger modellen 322

19.2.4 B - Kontroldel underretter præsentationer 322

19.2.5 C - Modellen underretter præsentationer 323

19.3 Eksempel - bankkonti 323

19.3.1 Modellen 324

19.3.2 Præsentationer 325

19.3.3 Kontroldel 326

19.4 Model-View - "den lille MVC" 328

19.4.1 Adskillelse af præsentation og programlogik 328

19.5 Opgaver 328

19.5.1 Løsning 329

Stikordsregister 330