summaryrefslogtreecommitdiffstats
path: root/Master/Reference Architectures and Patterns/hjp5/html/k100086.html
blob: 7df5cd3662f63497669902cfee4781c5b88201e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100083.html;106,k100085.html;107,k100087.html;108,k100090.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100083.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100085.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100087.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100090.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">Kapitel 13 - Strukturierung von Java-Programmen
</table>
<hr>


<!-- Section -->
<a name="sectlevel2id013003"></a>
<h2>13.3 Der <a name="ixa100816">Entwicklungszyklus</a> </h2>
<hr>
<ul>
<li><a href="k100086.html#sectlevel2id013003">13.3 Der Entwicklungszyklus</a>
<ul>
<li><a href="k100086.html#sectlevel3id013003001">13.3.1 Schematische Darstellung</a>
<li><a href="k100086.html#sectlevel3id013003002">13.3.2 Projektverwaltung</a>
<ul>
<li><a href="k100086.html#sectlevel4id013003002001">Getrenntes Kompilieren</a>
<li><a href="k100086.html#sectlevel4id013003002002">Java und make</a>
</ul>
</ul>
</ul>
<hr>


<!-- Section -->
<a name="sectlevel3id013003001"></a>
<h3>13.3.1 Schematische Darstellung </h3>

<p>
Der Turn-around-Zyklus beim Entwickeln von Java-Programmen unterscheidet
sich in mehrfacher Hinsicht von dem in traditionellen kompilierten
Programmiersprachen. 
<ul>
<li>Der Compiler erzeugt keine direkt ausf&uuml;hrbaren Programme,
sondern <font color="#660099">.class</font>-Files<a name="ixa100817"></a>,
die von einem Java-Interpreter ausgef&uuml;hrt werden. Mittlerweile
arbeiten bereits mehrere Betriebssystem-Hersteller daran, <font color="#660099">.class</font>-Files
direkt ausf&uuml;hrbar zu machen, und es gibt schon Prozessoren, die
den Maschinencode in <font color="#660099">.class</font>-Files ohne
zwischengeschalteten Interpreter verstehen.
<li>Es gibt keinen expliziten Link-Lauf, denn die verschiedenen <font color="#660099">.class</font>-Files
werden zur Ausf&uuml;hrungszeit gebunden.
<li>Die <font color="#660099">.class</font>-Files eines einzigen Projekts
k&ouml;nnen auf unterschiedlichen Plattformen mit unterschiedlichen
Compilern erzeugt werden.
<li>Die <font color="#660099">.class</font>-Files lassen sich auf
allen Plattformen ausf&uuml;hren, die einen Java-Interpreter besitzen;
unabh&auml;ngig davon, wo sie urspr&uuml;nglich entwickelt wurden.
</ul>

<p>
<a href="k100086.html#entwicklungszyklus">Abbildung 13.1</a> zeigt
den schematischen Ablauf bei der Entwicklung eines Java-Programms,
das aus den Klassen <font color="#000077"><tt>A</tt></font>, <font color="#000077"><tt>B</tt></font>
und <font color="#000077"><tt>C</tt></font> besteht. 
<p>
<a name="entwicklungszyklus"></a>
<img src="images/EntZyklus1.gif">
<p>

<p><i>
Abbildung 13.1: Der Entwicklungszyklus in Java</i></p>

<p>
Da der Java-<a name="ixa100818">Bytecode</a> plattformunabh&auml;ngig
ist, h&auml;tten die Klassen <font color="#000077"><tt>A</tt></font>,
<font color="#000077"><tt>B</tt></font> und <font color="#000077"><tt>C</tt></font>
aber auch ebensogut von verschiedenen Entwicklern auf drei unterschiedlichen
Plattformen entwickelt werden k&ouml;nnen, um sp&auml;ter auf einer
vierten Plattform ausgef&uuml;hrt zu werden. <a href="k100086.html#plattformuebergreifend">Abbildung 13.2</a>
zeigt dies beispielhaft. 
<p>
<a name="plattformuebergreifend"></a>
<img src="images/EntZyklus2.gif">
<p>

<p><i>
Abbildung 13.2: Plattform&uuml;bergreifende Entwicklung in Java</i></p>


<!-- Section -->
<a name="sectlevel3id013003002"></a>
<h3>13.3.2 <a name="ixa100819">Projektverwaltung</a></h3>


<!-- Section -->
<a name="sectlevel4id013003002001"></a>
<h4>Getrenntes Kompilieren </h4>

<p>
Wie die Abbildungen deutlich machen, spielen die <font color="#660099">.class</font>-Files
<a name="ixa100820"></a><a name="ixa100821"></a> f&uuml;r den Entwicklungsprozess
und die Portierbarkeit von Java-Programmen eine entscheidende Rolle.
Jede <font color="#660099">.class</font>-Datei enth&auml;lt den Bytecode
f&uuml;r eine &uuml;bersetzte Klasse. Zus&auml;tzlich sind in ihr
Informationen enthalten, um dynamisches Linken und Late-Bindung zu
unterst&uuml;tzen und gegebenenfalls Symbole, Zeilennummern und andere
Informationen f&uuml;r den Debugger zur Verf&uuml;gung zu stellen.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Eine der Grundregeln bei der Entwicklung von Java-Programmen ist es,
genau eine Klassendefinition je Quelldatei aufzunehmen. Anders als
etwa in C++, ist es in Java grunds&auml;tzlich nicht m&ouml;glich,
die Quellen einer einzigen Klasse auf mehrere Dateien zu verteilen
(und auf diese Weise <i>weniger</i> als eine Klasse in einer Quelldatei
zu speichern). Obwohl es - wie wir gleich sehen werden - m&ouml;glich
ist, <i>mehr</i> als eine Klasse in einer Quelldatei abzulegen, sollte
dies in der Regel nicht getan werden. Wenn diese Regeln eingehalten
werden, ergibt sich eine eindeutige Abbildung zwischen Klassen und
Quelldateien, die bei der sauberen Strukturierung eines Projektes
hilft. Durch die Verwendung von Paketen kann eine Verteilung der Quelltexte
auf verschiedene Verzeichnisse und Unterverzeichnisse erreicht werden.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF">&nbsp;Hinweis&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>

<p>
Wie bereits angedeutet, d&uuml;rfen tats&auml;chlich auch zwei oder
mehr Klassen in einer Quelldatei enthalten sein. Voraussetzung daf&uuml;r
ist allerdings, dass h&ouml;chstens eine von ihnen als <a name="ixa100822"><a href="index_p.html#ixb100084"><font color=#000080><tt>public</tt></font></a></a>
deklariert wurde. Eine solche Vorgehensweise kann beispielsweise bei
sehr kleinen Projekten, die nur aus ganz wenigen Klassen bestehen,
sinnvoll sein, um alle Klassen in eine einzige Datei zu bekommen.
Sie kann auch angewendet werden, wenn kleine Hilfsklassen ben&ouml;tigt
werden, die nur f&uuml;r eine einzige andere Klasse von Bedeutung
sind. Der Compiler erzeugt in jedem Fall eine separate <font color="#660099">.class</font>-Datei
f&uuml;r jede Klasse, die in einer Quelldatei enthalten ist. Wurde
in einer Quelldatei mehr als eine Klasse <a href="index_p.html#ixb100084"><font color=#000080><tt>public</tt></font></a>
deklariert, gibt es einen Compiler-Fehler. 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Wichtig ist in dem Zusammenhang auch, dass der Name der <a href="index_p.html#ixb100084"><font color=#000080><tt>public</tt></font></a>-Klasse
und der Name der Quelldatei identisch sein m&uuml;ssen. Dabei muss
die Gro&szlig;- und Kleinschreibung eingehalten werden, und auch bei
Klassennamen, die l&auml;nger als 8 Zeichen sind, muss der Dateiname
so lang wie der Klassenname sein. Klassen- und Dateiname unterscheiden
sich also nur durch die Extension <font color="#660099">.java</font>.
So befindet sich beispielsweise die Klasse <a href="index_i.html#ixb100170"><font color=#000080><tt>Integer</tt></font></a>
in einer Datei mit dem Namen <font color="#660099">Integer.java</font>
und die Klasse <a href="index_i.html#ixb100628"><font color=#000080><tt>InterruptedException</tt></font></a>
in einer Datei mit dem Namen <font color="#660099">InterruptedException.java</font>.
Da die Extension einer Java-Quelldatei in jedem Fall <font color="#660099">.java</font>
(und damit vierstellig) ist, ist eine vern&uuml;nftige Portierung
von Java auf Plattformen, die nur 8+3-Dateinamen unterst&uuml;tzen,
kaum sinnvoll m&ouml;glich und bisher auch nur ansatzweise gelungen.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF">&nbsp;Warnung&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>

<p>
Interessanterweise bietet Java volle <a name="ixa100823">Typsicherheit</a>
auch &uuml;ber die Grenzen von Quelldateien hinweg, ohne dass dazu
Header-Dateien oder andere Interface-Beschreibungen n&ouml;tig w&auml;ren.
Der Compiler verwendet w&auml;hrend der &Uuml;bersetzung einer Java-Klasse
die <font color="#660099">.class</font>-Dateien aller eingebundenen
Klassen und entnimmt diesen die Signatur der aufgerufenen Methoden.
Die Notwendigkeit zur Bereitstellung von separaten Header-Dateien
(wie beispielsweise in C++) und das fehlertr&auml;chtige Management
der Abh&auml;ngigkeiten zwischen ihnen und ihren Quelltexten entf&auml;llt
daher. 

<!-- Section -->

<a name="sectlevel4id013003002002"></a>
<h4>Java und make </h4>

<p>
Genau aus diesem Grund ist aber auch die Verwendung des <a name="ixa100824"><a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a></a>-Tools
zur Verwaltung der Dateiabh&auml;ngigkeiten in Java-Projekten schwierig.
Anstelle der klar definierten Abh&auml;ngigkeit einer Quelldatei von
einigen Headerdateien besitzt eine Java-Quelle meist eine Vielzahl
von (teilweise impliziten oder indirekten) Abh&auml;ngigkeiten zu
anderen Java-Quellen. Diese korrekt zu pflegen ist nicht einfach,
und ein <a name="ixa100825"><a href="index_m.html#ixb100631"><font color=#000080><tt>makefile</tt></font></a></a>
kann leicht unvollst&auml;ndige Abh&auml;ngigkeitsregeln enthalten.
Die daraus entstehenden Inkonsistenzen k&ouml;nnen zu schwer zu lokalisierenden
Laufzeitfehlern f&uuml;hren. 

<p>
Ein anderes Problem bei der Verwendung von <a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a>
ist die Vielzahl der separaten Compiler-Aufrufe. Da der Java-Compiler
des JDK selbst in Java geschrieben wurde, verursacht jeder Aufruf
einen erheblichen Overhead durch das erforderliche Starten der virtuellen
Maschine, der sich bei umfangreichen Projekten in unzumutbaren Wartezeiten
niederschl&auml;gt. 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Aus diesen Gr&uuml;nden ist es bei kleineren und mittleren Projekten
oftmals sinnvoll, auf den Einsatz von <a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a>
zu verzichten und die Programme bei Bedarf durch Aufruf von <font color="#000077"><tt>javac
*.java</tt></font> komplett neu zu kompilieren. Der Aufruf-Overhead
entsteht in diesem Fall nur einmal, und der Compiler braucht nicht
wesentlich l&auml;nger, als wenn lediglich eine einzige Quelle &uuml;bersetzt
w&uuml;rde. 

<p>
Eine Alternative zu <a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a>
ist das Open-Source-Projekt <a name="ixa100826"><a href="index_a.html#ixb100632"><font color=#000080><tt>ant</tt></font></a></a>,
ein komplett in Java geschriebenes <a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a>-Tool
mit umfangreichen Scripting-M&ouml;glichkeiten. <a href="index_a.html#ixb100632"><font color=#000080><tt>ant</tt></font></a>
kann am ehesten als Kombination aus <a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a>
und Kommando-Shell angesehen werden. Basierend auf XML als Steuerungssprache
bietet es eine Vielzahl von eingebauten Kommandos, die beim &Uuml;bersetzen
von Java-Programm und w&auml;hrend des gesamten Build-Prozesses n&uuml;tzlich
sind. Eigene Erweiterungen k&ouml;nnen in Java geschrieben und nahtlos
integriert werden. <a href="index_a.html#ixb100632"><font color=#000080><tt>ant</tt></font></a>
wird als <a name="ixa100827"><i>Jakarta</i></a>-Projekt entwickelt,
und seine Homepage ist <a href="http://ant.apache.org/">http://ant.apache.org/</a>.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
<tr>
<td><font color="#FFFFFF">&nbsp;Tipp&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
</tr>
</table>
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100083.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100085.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100087.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100090.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">&copy; 1998, 2007 Guido Kr&uuml;ger &amp; Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>