(Ebooks PDF) Download Introduction To Software Design With Java Martin P. Robillard Full Chapters
(Ebooks PDF) Download Introduction To Software Design With Java Martin P. Robillard Full Chapters
com
https://ebookmeta.com/product/introduction-to-software-
design-with-java-martin-p-robillard/
OR CLICK BUTTON
DOWNLOAD NOW
https://ebookmeta.com/product/java-foundations-introduction-to-
program-design-and-data-structures-5th-edition-john-lewis/
ebookmeta.com
https://ebookmeta.com/product/java-foundations-introduction-to-
program-design-and-data-structures-4th-edition-john-lewis/
ebookmeta.com
https://ebookmeta.com/product/different-for-boys-1st-edition-patrick-
ness-tea-bendix/
ebookmeta.com
Managerial Economics 12th Edition Christopher Thomas
https://ebookmeta.com/product/managerial-economics-12th-edition-
christopher-thomas/
ebookmeta.com
https://ebookmeta.com/product/clinician-s-handbook-of-oral-and-
maxillofacial-surgery-2nd-edition-daniel-m-laskin-eric-r-carlson/
ebookmeta.com
https://ebookmeta.com/product/clinical-esophagology-and-transnasal-
esophagoscopy-1st-edition-peter-c-belafsky/
ebookmeta.com
https://ebookmeta.com/product/the-design-pathway-for-regenerating-
earth-2nd-edition-joe-brewer/
ebookmeta.com
https://ebookmeta.com/product/evil-intent-1st-edition-jane-isaac/
ebookmeta.com
Advanced Practice Nursing in the Care of Older Adults, 3rd
edition Laurie Kennedy-Malone
https://ebookmeta.com/product/advanced-practice-nursing-in-the-care-
of-older-adults-3rd-edition-laurie-kennedy-malone/
ebookmeta.com
Martin P. Robillard
Introduction to
Software Design
with Java
Second Edition
Introduction to Software Design with Java
Martin P. Robillard
Introduction to
Software Design
with Java
Second Edition
Martin P. Robillard
School of Computer Science
McGill University
Montreal, QC, Canada
This Springer imprint is published by the registered company Springer Nature Switzerland AG
The registered company address is: Gewerbestrasse 11, 6330 Cham, Switzerland
Preface
This book is inspired by well over a decade of teaching software design at McGill
University. At first, my focus was to explain the software design know-how avail-
able from high-quality references. Soon, however, I realized that the main challenge
of teaching software design lay elsewhere. Communicating how to apply a design
technique or use a programming language mechanism was relatively easy. The real
struggle was to convey in which context we want to use a certain design technique,
and why. To do this, I needed to explain what is going on in a software developer’s
head. Over time, my lectures came to be more about exploring the space of alterna-
tive design decisions one can make in a given context.
The goal of this book is to help readers learn software design by discovering the
experience of the design process. I share my knowledge and experience of software
design through a narrative that introduces each element of design know-how in con-
text, and explores alternative solutions in that context. The narrative is supported by
hundreds of code fragments and design diagrams.
My hope is that this book can serve as an effective resource and guide for learning
software design. However, I do not believe that it is possible to develop significant
design skills solely by reading a book. In my own learning process, I have benefited
hugely from reading other people’s code, regularly writing code, and relentlessly
refactoring existing code to experiment with alternative design solutions. For this
reason, this book emphasizes coding and experimentation as a necessary comple-
ment to reading the text. To support this aspect of the learning process, I provide a
companion website with practice problems, and two sample applications that cap-
ture numerous design decisions. An orientation through these sample applications
is provided in Code Exploration insets throughout the chapters.
As its title indicates, this book provides an introduction to software design using
the Java programming language. The code used throughout the book, as well as the
sample applications, are in Java (version 8). My use of the Java language, however,
is a means to communicate design ideas, and not the topic of the book. I aimed to
cover design concepts and techniques that are applicable in a host of technologies.
Many concepts (such as encapsulation), will be relevant in any technology. Others
(such as inheritance) will be paradigm-specific, but usable in multiple programming
v
vi Preface
The first chapter is a general introduction to software design. The subsequent chap-
ters provide a progressive coverage of design concepts and techniques presented as
a continuous narrative anchored in specific design problems. In addition to the main
content, the book includes different features to orient readers and help use the book
as a launchpad for further exploration and learning.
• Chapter Overview: At the beginning of each chapter, a callout lists the concepts,
principles, patterns, and antipatterns covered in the chapter.
• Design Context: Following the overview, a paragraph titled Design Context in-
troduces the design contexts that are used as running examples in the chapter. It is
thus not necessary to read all previous chapters to understand the code discussed
in a given chapter.
• Diagrams: Each chapter includes numerous diagrams that illustrate design ideas.
Although they are provided to illustrate the ideas in the text, the diagrams are also
realistic illustrations of diagrams that can be used in practice as part of design
discussions.
• Code Fragments: Each chapter includes many code fragments. The code gen-
erally follows the conventions presented in Appendix B, with occasional con-
cessions made to make the code more compact. A complete version of the code
fragments can be downloaded from the companion website (see below).
• Insights: In each chapter, the main numbered sections are followed by an un-
numbered section titled Insights. This section forms an actionable summary of
the key information and advice provided in the chapter. It is meant as a catalog of
applicable design knowledge, and assumes the material in the chapter has been
mostly assimilated. The insights are in bullet points to be easily perused.
Preface vii
• Code Exploration: At various points in the text, insets titled Code Exploration
provide a discussion of software design in practice. To facilitate good flow and
avoid getting lost in details, the design contexts discussed in the main chapters
are kept as simple as possible. As a result, some interesting aspects of the soft-
ware design experience do get lost in the simplification. The code exploration
activity is the opportunity to consider how some of the topics presented in the
chapter manifest themselves in reality. The Code Exploration insets points to
specific parts of the code of the sample applications. In concert with reading the
text of a Code Exploration inset, I recommend reviewing the code referenced
and trying to understand it as much as possible. The sample applications are de-
scribed in Appendix C. They include JetUML, the application used to create all
the diagrams in the book.
• Further Reading: The Further Reading section provides pointers to references
that complement the material presented in the chapter.
• Companion Website Additional resources for this book are available in the
repository https://github.com/prmr/DesignBook. The material in the repos-
itory includes a complete and commented version of the code that appears in the
chapter content, as well as practice exercises and their solutions.
• Sample Applications The two Java applications described in Appendix C were
developed following many of the principles and techniques described in the book,
and are provided as an accessible basis for additional study and exploration.
Acknowledgments
I am most grateful to Mathieu Nassif, who carried out a detailed technical review
of the entire manuscript of the first edition, providing me with hundreds of correc-
tions, suggestions, and interesting points for discussion. I warmly thank Jin Guo for
reviewing most of the chapters and testing some of the material in her own teach-
ing, and Alexa Hernandez, Kaylee Kutschera, Brigitte Pientka, and Clark Verbrugge
for feedback on various parts of the manuscript. I am also thankful to Ralf Gerst-
ner, the executive editor in charge of computer science at Springer, for believing
in the project from the start and for seeing it through with his usual diligence and
professionalism.
As this is the second edition, I am also very grateful to my readers and to the
instructors who have adopted the book to support their teaching. The enthusiasm
many have expressed has been a major source of motivation for me to continue this
project. The feedback I received, and the numerous interesting discussions I had
about the content, were an invaluable contribution to this revised text.
Martin P. Robillard
April 2019
December 2021
Contents
1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Defining Software Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Design in the Software Development Process . . . . . . . . . . . . . . . . . . . 6
1.3 Capturing Design Knowledge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Sharing Design Know-How . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2 Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1 Encapsulation and Information Hiding . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 Encoding Abstractions as Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3 Scopes and Accessibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4 Object Diagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.5 Escaping References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.6 Immutability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7 Exposing Internal Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.8 Input Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.9 Design by Contract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
ix
x Contents
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4 Object State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.1 The Static and Dynamic Perspectives of a Software System . . . . . . . 67
4.2 Defining Object State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3 State Diagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.4 Designing Object Life Cycles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.5 Nullability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.6 Final Fields and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.7 Object Identity, Equality, and Uniqueness . . . . . . . . . . . . . . . . . . . . . . 83
4.8 The F LYWEIGHT Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.9 The S INGLETON Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4.10 Objects of Nested Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5 Unit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.1 Introduction to Unit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.2 Unit Testing Framework Fundamentals with JUnit . . . . . . . . . . . . . . . 102
5.3 Organizing Test Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.4 Metaprogramming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.5 Structuring Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.6 Tests and Exceptional Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
5.7 Encapsulation and Unit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
5.8 Testing with Stubs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
5.9 Test Coverage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
6 Composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
6.1 Composition and Aggregation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
6.2 The C OMPOSITE Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
6.3 Sequence Diagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
6.4 The D ECORATOR Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
6.5 Combining C OMPOSITE and D ECORATOR . . . . . . . . . . . . . . . . . . . . . 142
6.6 Polymorphic Copying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.7 The P ROTOTYPE Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
6.8 The C OMMAND Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
6.9 The Law of Demeter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Contents xi
7 Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7.1 The Case for Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
7.2 Inheritance and Typing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
7.3 Inheriting Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
7.4 Inheriting Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
7.5 Overloading Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.6 Polymorphic Copying with Inheritance . . . . . . . . . . . . . . . . . . . . . . . . 171
7.7 Inheritance Versus Composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
7.8 Abstract Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
7.9 Revisiting the D ECORATOR Design Pattern . . . . . . . . . . . . . . . . . . . . . 181
7.10 The T EMPLATE M ETHOD Design Pattern . . . . . . . . . . . . . . . . . . . . . . 182
7.11 Proper Use of Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Chapter 1
Introduction
In 1988, a fascinating little piece of code hits the limelight. That year, one of the
winners of the annual International Obfuscated C Code Contest features a program
that writes out to the terminal console the text of an eighteenth-century poem titled
The Twelve Days of Christmas. Figure 1.1 shows the first three verses of the text, as
they appear on the output console when executing the code. This poem is particular
in that its text has a regular structure. Text with such a structure is amenable to being
constructed by software in a way that goes beyond printing hard-coded data. With
a poem like The Twelve Days of Christmas, there was thus opportunity for creating
a clear and compact solution for displaying a poem on the console. However, as
promised by the name of the contest where it was featured, the program is anything
but clear. If fact, its inner workings are unfathomable. Figure 1.2 reproduces the
complete code of the program.
Fig. 1.1 Partial output of The Twelve Days of Christmas program of Figure 1.2
This quirky piece of computer science trivia illustrates the impact of a lack of
self-evident structure in software. Here, we have a programming problem with triv-
ial requirements: the functionality of interest requires no input and produces a sin-
Fig. 1.2 Source code of the 1988 The Twelve Days of Christmas C program by Ian Phillips. This
code compiles and executing it will produce the output illustrated in Figure 1.1. © 1988, Landon
Curt Noll and Larry Bassel. Reproduced with permission.
gle, unchangeable output. Yet, the code to support this functionality cannot be un-
derstood by a normal human being. But what is the problem, if the code works?
Software needs to change, and for software to change, at least one person must
be involved at some point. Software needs to change for a variety of reasons, from
fixing bugs to adapting the code to an evolving world. For example, many of the
gifts referred to in the poem are European birds (e.g., partridge, turtle doves, French
hens). Contemporary software development best practices include the localization
of software applications, namely, the option to tailor a software application to ac-
count for region-specific characteristics. It would thus be nice to adapt the code of
the application to replace the name of European birds to some that readers could re-
late to based on their own region (for example, to replace partridge with turkey for
North American users). To modify a piece of code, however, one must understand
its structure, and this structure must, to a certain extent, accommodate the change.
In the case of The Twelve Days of Christmas, any ambition to ever change the code
is hopeless.
The example of The Twelve Days of Christmas is facetious for sake of illustration.
Because this code was obfuscated on purpose, it would be comforting if we could
discount it as irrelevant. Unfortunately, because writing messy code is often the
path of least resistance in the complex social, technological, and economic reality
of software development, badly designed code is not hard to find. For example, in a
famous high-profile case where automotive software was determined by the courts
to be responsible for a fatal accident, the experts who reviewed the software likened
its structure to that of a bowl of spaghetti. Whether code is cryptic purposefully
or accidentally, the result is similar: it is hard to understand and change without
introducing errors.
1 Introduction 3
To explore the contrast, let us design a version of the program where the structure
is evident. Consistently with the rest of the code in this book, the program is in Java.
First, we can tackle the issue of producing the first line of a verse:
static String[] DAYS = {"first", "second", ..., "twelfth"};
This code is clear because the function is short, it abstracts an obvious concept
(the creation of the first line), and the only parameterization involved maps directly
to the problem domain (changing the day).
The second sub-problem is to create the list of gifts for a given day. In this case
we can leverage the inherent recursion in the poem’s structure to organize the code
in a function that creates a list of gifts by adding the last gift to a smaller list of gifts:
static String[] GIFTS = { "a partridge in a pear tree",
"two turtle doves", ... };
At a glance, we see the overall structure of the code: a special case for the first
verse, then an iteration through the remaining eleven verses, where each verse is
created by concatenating the output of two functions: one to create the first line, and
the other to create the list of gifts.
4 1 Introduction
Herebaeld staarde hem na, hoe hij reed op ’t witte ros door het
hooge gras, moedig op Brendel aan en dacht:
„Zoo waar, ik geloof dat de kloeke jonge vorst ons wreken zal.” En
zijn vuist tegen de ster ballend zeide hij: „Wacht du, misleider. Du
zult weten, dat du ons op dwaalwegen hebt gevoerd.”
„Kortzwaard tegen kortzwaard!” riep prins Istovar. „Sta zeg ik, als du
kampen durft!”
Prins Istovar buitelde schier over den kop van Zeven heen. Hij steeg
af, nam het paard bij den teugel en keek om zich heen om te
ontdekken, wat het paard verschrikt had. Boven aan den hemel was
een zware wolk voor de sterren geschoven. De prins keek op en
merkte het:
In ’t vage duister van den laten avond zag de prins nu uit een
boschje Brendel naderen, maar in zwarte rusting, gelijk roovers die
plegen te dragen. Het was een groote, zware vijand, die vooraf werd
gegaan door een klein, zwart paard. Nu hij nader kwam zag hij, dat
Brendel op een wagen zat en dat achter in de wagen nog drie
roovers hadden plaats genomen.
De prins steeg weder te paard, stuurde Zeven zoo dat het ros met
een sprong midden voor de kar van Brendel stond en met Thoering
dreigend riep hij:
Brendel hield zijn klein ros in en nu, in het vage duister zag de prins
hoe de vier roovers samenspraak hielden.
Opeens sprongen de vier roovers uit de kar en elk vluchtte naar een
andere zijde.
De prins gaf een ruk aan den teugel van Zeven en rende een roover
na. Deze, zich omkeerend riep: [99]
„Hier staat prins Istovar thoe Mjellego—Vrijheid alle tijd! Noem dijn
kampspreuk!”
„Koning Gise van Bedekoog!” klonk het in ’t half duister van den
stillen nacht.
„Koning, aan u den eersten streek.”
„Dat Harimona wete, dat mijn bloed voor haar vloeide!” riep prins
Istovar.
„Dat Harimona wete, dat mijn bloed voor haar vloeide!” antwoordde
Koning Gise.
De prins wilde wel een roover bekampen maar niet een eerlijken
mede-minnaar en daarom stak hij Thoering op, zich
verontschuldigend bij Koning Gise over zijn uitdaging.
„Die voor di uit reden, zeiden mij, dat du Brendel waart, den grooten
roover, den vijand van Sigbert, den Batouwer. En daar ik avonturen
zoek, wilde ik di te lijf.”
„Hoe jammer, dat du niet vroeger mijn weg gekruist hebt. Want dan
hadde du uw kloeken arm kunnen leenen in het groote gevecht, dat
ik en mijn mannen gevoerd heb met Fridbold, den beruchten roover
uit het woud van Gibick en zijn veertig rotgenooten.”
Onderwijl was Melle, doodelijk bevreesd voor ’t lot van den prins, die
alleen in den laten avond op een ster was toegerend, zijn heer
gevolgd. Hij liep langen tijd een eind achter Zeven aan, maar het
gelukte hem niet, het paard in te halen. Toen de prins door de
ontmoeting met Koning Mise en zijn drie dichters eenig oponthoud
had, kwam de waakzame dienaar, eindelijk buiten adem bij den prins
en hoorde juist hoe Koning Mise, den moedigen jonkman alleen op
een troep gevaarlijke roovers afzond, het verderf te gemoet. Daar
Melle, ademloos, Zeven die weder in galop verder rende, niet
vermocht te volgen, keerde al zijn verbittering zich tegen Koning
Mise, dien hij, bij den schouder vattend toeriep:
Hij greep daarom ook Pimm bij de schouder en hem tegen den
Koning met kracht aankwakkend riep hij: „Grendeldebliksem,
geboefte, du hebt mijn heer verraden. Wacht, dat zult di met den
dood boeten.”
Weder schudde hij den Koning tegen zijn dichter en [102]met zooveel
geweld, dat beiden neusbloedingen kregen.
Pill en Pinn wisten niet wat zij zouden doen. Melle had wel is waar
nu zijn beide handen vol, doch toen Pill tot ontzet naderde, gaf hij
hem zulk een schop, dat de magere, verzwakte dichter achterover
tuimelde en zijn handen voor den buik houdend, kreet van pijn.
En weer kwakte Melle den Koning met kracht tegen zijn dichter aan,
zoodat beiden zich voelden bezwijmen.
Nu naderde Pinn, maar de les, die Pill gekregen had, zich ter harte
nemend, bedenkend, dat wie niet sterk is, slim moet zijn, riep hij:
Melle bracht de slip van zijn jachthemd aan de oogen en van dit
oogenblik maakte Pinn gebruik om den slag, dien hij lang beraamd
had, toe te brengen. Melle met zijn vuist een stomp tegen de slapen
gevend, dat de toch al oververmoeide man omtuimelde, kreet hij:
„Vaar naar Balduwina, Friesche stijfkop!” [103]
„Spil geen kracht!” riep Pinn, „ik heb den woesteling neergeveld. Het
was een Fries, want hij roept Balduwina aan. Maar ik gaf hem iets
tegen zijn Friesche kop, dat nog harder was.”
„Is hij goed dood?” vroeg Koning Mise, van boven uit het loover.
„De slag kwam zoo aan,” antwoordde Pinn, „dat hij met zijn kop naar
den grond boog.”
„Ja, Koning.”
„Dan moeten wij maken, dat wij ver zijn voor hij weer ontwaakt.
Friesche koppen buigen niet—die breken.”
Zelf langs den stam naar beneden glijdend, gaf hij zijn drie dichters
het waardige voorbeeld en vluchtte naar de zijde, vanwaar de prins
op Brendel was aangereden. Zij liepen als lieden, die weten dat het
leven van hun snelheid afhangt. Terugkeeren naar ’t kamp van
Koning Gise dorsten zij niet, voor zij bij helderen dag konden zien,
hoe den afloop geweest was van ’t gevecht des dolzinnigen prinsen
met den dikken Koning Gise. Blijven was al even gevaarlijk, daar de
prins kon terugkeeren of Melle zijn bezinning herkrijgen. Daarom
renden zij steeds voorwaarts tot aan het woud, waar Herebaeld
wachtte op de terugkomst van prins Istovar thoe Mjellego, die
Brendel was gaan bekampen.
„Pas op!” riep Koning Mise, „daar staat het gevolg van den dollen
prins.”
„Dezen nacht niet, heer. Zij zijn allen zeer vermoeid en slapen en
Melle, die de wacht hield, is opgetrokken om zijn heer bij te staan bij
de tuchtiging van Brendel, die ons op dwaalwegen heeft gevoerd.”
„Jongeling, wij zijn vier helden, die op avontuur zijn uitgegaan. Het
zou ons weinig moeite kosten di neer te slaan, maar wij zijn
grootmoedig. Blijf hier en wacht tot de dappere prins terugkeert en
zoodra du hem ziet, haast di ons het te voren te melden, opdat wij
hem waardig kunnen ontvangen. Wij zijn in zijn kamp.”
Toen zij weder bij Herebaeld kwamen, liep Koning Mise vooruit en
sprak tot den jongeling:
Herebaeld voelde ’t hart van angst kloppen. „Hebben zij mijn vader
ook bestolen en mijn broers?”
„Waren het die drie groote lieden, die naakt sliepen op berehuiden
met bloote voeten en onder een dek van grauwe wol?”
„Vriend, haast di. Ik geloof, dat de kobolden hun nog niet beroofd
hebben … Maar haast di, als dijn erfdeel di heilig is!”…
Pimm sprak:
Pinn sprak:
Een eind verder, terzijde van den weg, veilig voor overval, vloten zij
’t ezeltje, legden den buit neder in ’t karretje, ontstaken een vuur,
hulden zich in hun overkleederen en vleiden zich ter ruste. Maar
voor zij, vroolijk na den welgelukten rooftocht insliepen, sprak Pill:
Pimm sprak:
Geroofde schoen,
Geeft ook fatsoen.
Pinn sprak:
Al kan men niet betalen,
Dan draagt men toch sandalen.
[107]
[Inhoud]
HOOFDSTUK XII.
De oude priester lag stil op het leger en luisterde toe. Hijzelf, hoewel
diep in ’t gemoed ook twijfelend, voelde zich bevreesd om den
jongen prins, te sterken in diens twijfel. Daarom verdedigde hij het
geloof. Hij sprak van de voorspellingen, die uit waren gekomen, van
de onbedriegelijke voorteekenen, van de berichten van
geloofwaardige lieden, die toch met eigen oogen elfen, nixen,
kabouters en bosch-geesten hadden gezien. Zijn eigen vader was
eens in den winternacht van een verre reis huiswaarts gekeerd. Hij
verdwaalde, hoewel hij een gewijde fakkel had ontstoken, die zijn
pad verlichtte. Het was beginnen te misten. De nevel om hem heen
werd steeds dichter en natter en eindelijk kwam hij aan een groote
woning. Deze trad hij binnen en nu kwam bij in een ruimen hal, hel
verlicht, waar terzijde vreemde, groote potten stonden. Uit een pot
riep een stem: „Ik ben het, dijn grootvader. Mij heeft het zeewijf in
de diepte getrokken en bewaakt mij in haar oelkenpot. Du bent hier
diep in ’t kolle-water en hadde du de gewijde fakkel niet gedragen,
dan zoude du reeds lang verdronken zijn. Want wat du voor mist
hield was water, in welks kolk du bent gezonken, tot in het huis van
het zeewijf. Vlied vóór ze terugkomt want anders bent du gevangen.”
Toen had Myst’s grootvader de ziel uit den pot bevrijd, die als een
lichtje voor hem uit [109]zweefde en hem den weg wees. Eindelijk
zwond de vochtige nevel en de sterren fonkelden hoog aan de lucht.
Den volgenden morgen zag hij, dat zijn schoenen vol zeeslik zaten,
hoewel de wegen overal hard bevroren waren.
„Een voerman zag eens op de weide,” ging Myst voort, „dat nixen
heldere witte wasch aan den rand van een bron te drogen lagen.
Eén nix zat bij de wasch en wiegde haar kind. Zij vroeg hem het kind
voor haar te wiegen en nadat hij het gedaan had, schonk zij hem
een zweep met barnsteen-versiering. Ik zelf heb de zweep gezien.”
„Het waren beter meester, als du de nix gezien had! Hebt di ooit een
geest gezien?”
„Nooit. Zoo gelukkig ben ik al mijn leven niet geweest,” zei Myst
neerslachtig.
„En wat denkt du dan van Wotan en van Thor en van Frija en van de
Asen? Zou du dan ook die willen verklaren voor bedrog?”
„De groote goden heb ik nog niet onderzocht. Als ik kon vliegen
gelijk de adelaar en opstijgen hoog in de [111]luchten, altoos maar
hooger tot daar waar de zonneschijf staat, dan zoude ik kunnen
weten wat de waarheid is omtrent de groote goden. Als ik
teruggekeerd ben in mijn land en ik ben tot Koning gekozen, zal ik
een vloot van groote schepen doen bouwen. Maar niet om zooals
vader naar ’t Paarden-eiland te gaan om buit en roem, maar ik neem
reuzenzwaarden mee en knappe speerwerpers en dan vaar ik den
verren oceaan in, tot daar waar de wereld eindigt en de groote hel
begint, waar de zeeslangen kruipen en de draken dreigen en de
Nevelingen zweven. Daar meester wil ik zien, zoeken en weten.”
„En als du met dijne schepen dan eens afvalt van de wereld en stort
in ’t niet?”
Terwijl de eenzame denker zoo sprak met den zieken grijsaard, liep
Haun in het woud en zocht naar noten en vruchten of schoot met
zijn speer naar kleinwild en zette strikken op voor vossen en wilde
hoenders. Maar ’t liefste toch blies hij op zijn horen, zich
verbeeldend dat hij krijgers [112]aanvoerde in den oorlog of dat hij
de reidansen mocht blazen bij de offermaagden. Op een dag,
vroolijk toeterend door de stroth loopend, daar hoorde hij weder
denzelfden geest, die ook kon toeteren op den horen. Hij blies een
wijsje en elke toon werd tot drie maal toe herhaald. Den ganschen
dag bleef hij hier spelen, beproevend den boschgeest er toe te
brengen met hem samen te toeteren zooals de Dingher gedaan had.
Maar de boschgeest begreep hem niet, speelde geen eigen ranken
en loovertjes, doch bleef maar altoos driemaal naspelen wat Haun
voorspeelde. Hij riep den boschgeest toe, dat deze zou aanvangen
met de elfenstem en dat hij dan zou invallen met het reckengeluid,
doch de boschgeest riep driemaal terug, dat Haun zou aanvangen
met de elfenstem en hij zou invallen met het reckengeluid. Toen
Haun toegaf en begon met de zoete, hooge tonen begon echter de
boschgeest ook. Dat maakte Haun moedig en hij begon met den
boschgeest te spotten, die niets uit zichzelf kon en altoos na-blies.
Hij werd elken dag moediger Haun, hoewel hij niets ervan zeide tot
den meester en tot Sogol, vreezend dat zij hem zouden bestraffen
wegens zijn spotternij. Haun begon naar den boschgeest te zoeken,
beloofde hem vossevellen en versche eieren, wanneer hij zich liet
zien. Toen de boschgeest niet kwam, legde hij drie vellen van vossen
neer en daarop twaalf versche eieren en riep, dat hij weg zou gaan
en dat de boschgeest ze ongezien mocht wegnemen. De boschgeest
antwoordde hetzelfde terug, maar toch ging Haun naar de woning.
Den volgenden morgen echter lagen de eieren er niet meer, maar
waren leeggegeten, doch de vellen waren er nog.
„Dat liegt du. Ik heb bij den Dingher de schat gelaten en zij is al
lange weder vrij!”.…
„Dat liegt du. Ik heb bij den Dingher de schat gelaten en zij is al
lange weder vrij!” riep de boschgeest.
„Du.. du bent nooit bij den Dingher geweest. Die zou di gauw den
schop hebben gegeven, omdat du zoo slecht toetert.”
Nu eerst ging Haun er toe over, zijn avontuur aan Sogol te vertellen.
Die lachte en toen de jongen hem zeide, hoe hij den boschgeest had
uitgescholden en hoe hij hem met den speer was nagerend, maar
dat deze niets anders had gedaan, dan zich verstoppen en de
schimpen herhalen, nam Sogol het hoofd van den knaap tusschen
de handen en kuste hem op voorhoofd en wangen en zeide:
„Braaf zoo mijn jongen. Du bent een echte Nerviër. Ik zal di tot
krijgstoeter verheffen op mijn groote reis en di een wapenspreuk
geven.”
„Welke?” vroeg Haun.
„Vreezeloos en trouw!”
Dien dag gingen Sogol en Haun samen naar den boschgeest. Sogol
liet Haun enkele tonen blazen, dan hier, dan daar, dan verder en hij
luisterde scherp naar het antwoord.
’s Avonds, bij ’t haardvuur, sprak hij met Myst over den boschgeest,
den eenige in den stroth, dien hij niet had kunnen verklaren. Hij
bewoonde een zeker deel van den [114]stroth, onder den grond of
terzijde van twee dikke eiken. Zijn gebied was niet heel groot en
Sogol wist precies waar de geest antwoordde en waar niet. Ook had
hij, juist als Haun, den geest op velerlei wijzen genoodigd om zich te
vertoonen, eveneens zonder gevolg. Nu de jongen vertelde, dat de
geest de vossevellen niet had genomen, maar de eieren had
uitgezogen, begon Sogol na te denken. Hij legde op dezelfde plaats
nu ook eieren neder en met een celt gewapend, bleef hij met Haun
dien avond en dien nacht de wacht houden achter een beuk, dicht
bij de eieren, besloten om als de boschgeest de eieren kwam halen,
hem staande te houden of neer te vellen.
Sogol wierp haar de celt na en raakte haar zoo, dat zij neerstortte.
Haun was Sogol nagesprongen, maar nu zij den geest zagen vallen,
juichten zij beiden een: Ojo, Ojo!
Doch de boschgeest antwoordde van een andere zijde met een ojo!
en de gedaante kon dus niet de boschgeest zijn geweest.
En toen zij een toorts hadden aangestoken door een stuk droog hout
te draaien in een doorboord houtblok, zagen zij bij den vlam dat een
magere oude vos, schier tandeloos, die geen dieren meer kon
aanvallen, zich aan de eieren wilde te goed doen. [115]
Zij gingen met den dooden vos naar de hut. Doch al ’s morgens
vroeg liepen ze weer beiden naar den boschgeest. Nogmaals liet
Sogol Haun toeten.. nu hier, dan daar, dan op een boom en met een
punthout trok hij lijnen langs den grond en maakte teekens om te
onthouden, waar de geest driemaal antwoordde en waar tweemaal
en waar eenmaal en waar de geest niet antwoordde.
„Als hij hier is, moet hij hier wonen. Ik zal die eiken omwerpen.”
En nu zag Haun hoe Sogol alleen, gedurende dagen bezig was om
de twee eiken om te werpen. Dat deed hij heel vreemd, niet zooals
in ’t land der Nerviërs, waar zij met lange bronzen messen heen en
weer sneden, doch Sogol groef een geul rondom den stam en wierp
deze vol stukken hars, die hij dan met een grooten steen
fijnstampte. Ook boorde hij in den stam beneden diepe gaten en
stopte die vol met harspoeder. Onderwijl vermaakte Haun zich met
toeteren en nu bij de grenzen van het gebied van den boschgeest
wist, vond hij een aardig spel uit. Hij blies eerst een wijsje, daar
waar de boschgeest niet antwoordde. Dan blies hij in ’t gebied van
den boschgeest ’t zelfde wijsje gedempt, door zijn vuist in den horen
te steken en daarna weer snelde hij buiten ’t gebied en speelde
weder zonder drieschal. En nog voor Sogol de beide eiken zoover
gereed had, dat het hars kon worden aangestoken was Haun zoover,
dat hij, beurtelings op en buiten ’t gebied van den boschgeest
loopend en hij alleen zijn horen blazend, den indruk wekte, alsof er
vier mannen op vier horens speelden. [116]
En weer kuste Sogol den jongen, toen deze hem zijn kunststuk
vertoonde.
Dien dag stak hij het hars niet aan, maar wilde denken en spreken
met Myst, die zich wat beter begon te gevoelen en op vertrekken
aandrong. Sogol vertelde Myst van ’t geen hij en Haun beleefd
hadden, sprak over de onverklaarbare snaakschheid van den geest
en hoe hij hoopte, door het vellen der eiken, hem uit zijn gebied op
te jagen en hen zoo te zien te krijgen … als hij te zien is en als hij
werkelijk bestaat.
„Maar aan hem is het niet mogelijk te twijfelen. Hij laat zich toch
hooren.”
„Dat is de vraag juist. Hij laat zich hooren, maar nooit anders dan
wanneer een ander zich heeft doen hooren. Hoewel wij zijn stem
vernemen, zegt die stem niets anders dan een herhaling van ’t geen
wij gezegd hebben. Met dezen boschgeest gaat het al niet anders
dan met de andere goden, die hun stem niet doen hooren. Deze
schalt onze stem terug.. de anderen zijn herhalingen van
verbeeldingen. Deze twee eiken vormen mijn laatste proefneming.
Zie ik ditmaal niet een echten geest, dan is ’t met mijn geloof voor
goed gedaan en ik zal uit mijn rijk de priesters verjagen.”
Met de punt van een lans, hoopte Sogol het hars dat afvloeide,
weder tegen de stamvoeten op, die nu zwart en verkolend door ’t
vuur ingevreten, begonnen over te hellen. Myst was terzij op een
stronk gaan zitten en wachtte angstig maar met groote verwachting
op ’t verschijnen van den boschgeest. Opeens begon een der eiken
te hellen en plotseling nu, eenmaal aan ’t vallen, zonk de zware
boom neer, sleurde met de takken den tweeden mede, die hoewel
nog in den kern vast, met een knak afbrak en meeviel …
Sogol sprong door de takken heen en den hoorn van Haun nemend,
liep hij een eind terzijde en blies … Nu kwam de schal flauw éénmaal
terug … Hij snelde naar een andere plaats, daar waar de stem van
den boschgeest gewoonlijk uit de diepte scheen te komen, en blies.
Maar geen schal antwoordde. Hij liep in rechte lijn naar de
tegenovergestelde plaats. Nu weerklonk de hoornstoot eerst luid en
dan iets verder heel zacht
„Neen meester … er zijn geen goden … noch in, noch op, noch boven
de aarde … Wat daar leeft is de weerklank van ons leven, is de schal
die terugvalt op onzen roep … Wijzelf zijn de goden en als een god
zal ik voortaan strijden tegen hen, die den weerschal hooger stellen
dan den toon des horens zelf …”