skip to main content
Skip header Section
Thinking in JavaDecember 2002
Publisher:
  • Prentice Hall Professional Technical Reference
ISBN:978-0-13-100287-6
Published:01 December 2002
Pages:
1400
Skip Bibliometrics Section
Bibliometrics
Skip Abstract Section
Abstract

From the Book: I suggested to my brother Todd, who is making the leap from hardware into programming, that the next big revolution will be in genetic engineering. We'll have microbes designed to make food, fuel and plastic; they'll clean up pollution and in general allow us to master the manipulation of the physical world for a fraction of what it costs now. I claimed that it would make the computer revolution look small in comparison. Then I realized I was making a mistake common to science fiction writers: getting lost in the technology (which is of course easy to do in science fiction). An experienced writer knows that the story is never about the things; it's about the people. Genetics will have a very large impact on our lives, but I'm not so sure it will dwarf the computer revolution - or at least the information revolution. Information is about talking to each other: yes, cars and shoes and especially genetic cures are important, but in the end those are just trappings. What truly matters is how we relate to the world. And so much of that is about communication. This book is a case in point. A majority of folks thought I was very bold or a little crazy to put the entire thing up on the Web. "Why would anyone buy it " they asked. If I had been of a more conservative nature I wouldn't have done it, but I really didn't want to write another computer book in the same old way. I didn't know what would happen but it turned out to be the smartest thing I've ever done with a book. For one thing, people started sending in corrections. This has been an amazing process, because folks have looked into every nook and cranny and caught both technical and grammatical errors, and I've been ableto eliminate bugs of all sorts that I know would have otherwise slipped through. People have been simply terrific about this, very often saying "Now, I don't mean this in a critical way" and then giving me a collection of errors I'm sure I never would have found. I feel like this has been a kind of group process and it has really made the book into something special. But then I started hearing "OK, fine, it's nice you've put up an electronic version, but I want a printed and bound copy from a real publisher." I tried very hard to make it easy for everyone to print it out in a nice looking format but it didn't stem the demand for the published book. Most people don't want to read the entire book on screen, and hauling around a sheaf of papers, no matter how nicely printed, didn't appeal to them either (plus I think it's not so cheap in terms of laser printer toner). It seems that the computer revolution won't put publishers out of business, after all. However, one student suggested this may become a model for future publishing: books will be published on the Web first, and only if sufficient interest warrants it will the book be put on paper. Currently, the great majority of books of all kinds are financial failures, and perhaps this new approach could make the publishing industry more profitable. This book became an enlightening experience for me in another way. I originally approached Java as "just another programming language," which in many senses it is. But as time passed and I studied it more deeply, I began to see that the fundamental intention of the language is different than in all the other languages I have seen. Programming is about managing complexity: the complexity of the problem you want to solve laid upon the complexity of the machine in which it is solved. Because of this complexity, most of our programming projects fail. And yet of all the programming languages that I am aware, none of them have gone all out and decided that their main design goal would be to conquer the complexity of developing and maintaining programs. Of course, many language design decisions were made with complexity in mind, but at some point there were always some other issues that were considered essential to be added into the mix. Inevitably, those other issues are what causes programmers to eventually "hit the wall" with that language. For example, C++ had to be backwards-compatible with C (to allow easy migration for C programmers), as well as efficient. Those are both very useful goals and account for much of the success of C++, but they also expose extra complexity that prevents some projects from being finished (certainly, you can blame programmers and management, but if a language can help by catching your mistakes, why shouldn't it ). As another example, Visual Basic (VB) was tied to BASIC, which wasn't really designed to be an extensible language, so all the extensions piled upon VB have produced some truly horrible and un-maintainable syntax. On the other hand, C++, VB and other languages like Smalltalk had some of their design efforts focused on the issue of complexity and as a result are remarkably successful in solving certain types of problems. What has impressed me most as I have come to understand Java is what seems like an unflinching goal of reducing complexity for the programmer. As if to say "we don't care about anything except reducing the time and difficulty of producing robust code." In the early days, this goal has resulted in code that doesn't run very fast (although there have been many promises made about how quickly Java will someday run) but it has indeed produced amazing reductions in development time; half or less of the time that it takes to create an equivalent C++ program. This result alone can save incredible amounts of time and money, but Java doesn't stop there. It goes on to wrap all the complex tasks that have become important, such as multithreading and network programming, in language features or libraries that can at times make those tasks trivial. And finally, it tackles some really big complexity problems: cross-platform programs, dynamic code changes, and even security, each of which can fit on your complexity spectrum anywhere from "impediment" to "show-stopper." So despite the performance problems we've seen, the promise of Java is tremendous: it can make us significantly more productive programmers. One of the places I see the greatest impact for this is on the Web. Network programming has always been hard, and Java makes it easy (and they're working on making it easier all the time). Network programming is how we talk to each other more effectively and cheaply than we ever have with telephones (email alone has revolutionized many businesses). As we talk to each other more, amazing things begin to happen, possibly more amazing even than the promise of genetic engineering. In all ways: creating the programs, working in teams to create the programs, building user interfaces so the programs can communicate with the user, running the programs on different types of machines, and easily writing programs that communicate across the Internet - Java increases the communication bandwidth between people. And I think that perhaps the results of the communication revolution will not be seen from the effects of moving large quantities of bits around. We shall see the true revolution because we will all be able to talk to each other more easily - one-on-one, but also in groups and as a planet. I've heard it suggested that the next revolution is the formation of a kind of global mind which results from enough people and enough interconnectedness. Java may or may not be the tool that foments that revolution, but at least the possibility has made me feel like I'm doing something meaningful here by attempting to teach the language.

Cited By

  1. ACM
    Bailey M Fundamentals seminar ACM SIGGRAPH 2015 Courses, (1-129)
  2. ACM
    Bailey M and Cunningham S Introduction to computer graphics SIGGRAPH Asia 2011 Courses, (1-58)
  3. Wu Q, Liang G, Wang Q, Xie T and Mei H Iterative mining of resource-releasing specifications Proceedings of the 26th IEEE/ACM International Conference on Automated Software Engineering, (233-242)
  4. ACM
    Bailey M and Cunningham S Introduction to computer graphics ACM SIGGRAPH ASIA 2010 Courses, (1-100)
  5. ACM
    Lachmund S Auto-generating access control policies for applications by static analysis with user input recognition Proceedings of the 2010 ICSE Workshop on Software Engineering for Secure Systems, (8-14)
  6. Lachmund S and Hengst G Auto-generation of least privileges access control policies for applications supported by user input recognition Transactions on computational science XI, (17-38)
  7. Ribeiro J, Zenha-Rela M and Fernández de Vega F (2009). Test Case Evaluation and Input Domain Reduction strategies for the Evolutionary Testing of Object-Oriented software, Information and Software Technology, 51:11, (1534-1548), Online publication date: 1-Nov-2009.
  8. ACM
    Huisman M On the interplay between the semantics of Java's finally clauses and the JML run-time checker Proceedings of the 11th International Workshop on Formal Techniques for Java-like Programs, (1-6)
  9. Delač D, Krleža Z, Šnajder J, Dalbelo Bašić B and Šarić F TermeX Proceedings of the 10th International Conference on Computational Linguistics and Intelligent Text Processing, (149-157)
  10. ACM
    Bailey M and Cunningham S Introduction to computer graphics ACM SIGGRAPH ASIA 2008 courses, (1-103)
  11. Boer C and Saanen Y Controls Proceedings of the 40th Conference on Winter Simulation, (2639-2647)
  12. ACM
    Leite C, Perkusich M, Fernandes Y, Perkusich A, Neto P and Neto F Query language in systems with hard real-time constraints Proceedings of the 2008 Euro American Conference on Telematics and Information Systems, (1-8)
  13. ACM
    Bailey M Introduction to SIGGRAPH and interactive computer graphics ACM SIGGRAPH 2008 classes, (1-85)
  14. ACM
    Ribeiro J Search-based test case generation for object-oriented java software using strongly-typed genetic programming Proceedings of the 10th annual conference companion on Genetic and evolutionary computation, (1819-1822)
  15. Fontana C, Capellossi C, Melo V and Dias E Technological model for application of mobile technology in the process of port monitoring Proceedings of the 9th WSEAS International Conference on International Conference on Automation and Information, (216-221)
  16. ACM
    Lanza M, Murphy A, Robbes R, Lungu M and Bonzini P A teamwork-based approach to programming fundamentals with scheme, smalltalk & java Proceedings of the 30th international conference on Software engineering, (787-790)
  17. Collado E, Soto M, Delamer I and Lastra J (2008). Embedded XML DOM parser, EURASIP Journal on Embedded Systems, 2008, (1-6), Online publication date: 1-Apr-2008.
  18. Yiyu T, Fong A and Xiaojian Y Architectural solution to object-oriented programming Proceedings of the 12th Asia-Pacific conference on Advances in Computer Systems Architecture, (387-398)
  19. ACM
    Tomov O and Smrikarov A Exploring environments for creation of e-learning simulators Proceedings of the 2007 international conference on Computer systems and technologies, (1-5)
  20. ACM
    Noonan R and Hott J (2007). A course in software development, ACM SIGCSE Bulletin, 39:1, (135-139), Online publication date: 7-Mar-2007.
  21. ACM
    Noonan R and Hott J A course in software development Proceedings of the 38th SIGCSE technical symposium on Computer science education, (135-139)
  22. Malayeri D and Aldrich J Practical exception specifications Advanced Topics in Exception Handling Techniques, (200-220)
  23. Tsetsos V, Sekkas O, Priggouris I and Hadjiefthymiades S (2006). A scheduling framework for enterprise services, Journal of Systems and Software, 79:2, (259-272), Online publication date: 1-Feb-2006.
  24. ACM
    Bailey M Introduction to SIGGRAPH and computer graphics ACM SIGGRAPH 2005 Courses, (1-es)
  25. He Q, Qiu L and He Z Design and implementation of a J2EE-Based platform for network teaching Proceedings of the 4th international conference on Advances in Web-Based Learning, (49-55)
  26. ACM
    Stepanian L, Brown A, Kielstra A, Koblents G and Stoodley K Inlining java native calls at runtime Proceedings of the 1st ACM/USENIX international conference on Virtual execution environments, (121-131)
  27. Hyun C Parallel and distributed components with java Proceedings of the 2005 international conference on Computational Science and Its Applications - Volume Part III, (927-937)
  28. Musumbu K The semantics of Kalah game Proceedings of the 4th international symposium on Information and communication technologies, (191-196)
  29. Su Y, Guo R and Chang S (2005). Virtual fab, Information and Management, 42:2, (329-348), Online publication date: 1-Jan-2005.
  30. Jacobs P and Verbraeck A Single-threaded specification of process-interaction formalism in Java Proceedings of the 36th conference on Winter simulation, (1548-1555)
  31. ACM
    Manoilov P, Mateev V and Iliev M Graphical user interface of an interactive system for schemes design, used in distance learning Proceedings of the 5th international conference on Computer systems and technologies, (1-5)
  32. ACM
    Mateev V, Manoilov P and Iliev M Tutoring tool for logical schemes design Proceedings of the 5th international conference on Computer systems and technologies, (1-5)
  33. Daum T and Sargent R Open source initiatives for simulation software Proceedings of the 34th conference on Winter simulation: exploring new frontiers, (634-640)
  34. ACM
    Conroy D The use of domain level semantics to support unanticipated system adaptation Companion of the 17th annual ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications, (4-5)
  35. ACM
    Hosny H, Khaled O and Fathalla M (2000). ILE, ACM SIGCSE Bulletin, 32:3, (152-155), Online publication date: 1-Sep-2000.
  36. ACM
    Hosny H, Khaled O and Fathalla M ILE Proceedings of the 5th annual SIGCSE/SIGCUE ITiCSEconference on Innovation and technology in computer science education, (152-155)
  37. ACM
    Daum T and Sargent R Scaling, hierarchical modeling, and reuse in an object-oriented modeling and simulation system Proceedings of the 31st conference on Winter simulation: Simulation---a bridge to the future - Volume 2, (1470-1477)
  38. ACM
    Klemm R Practical guidelines for boosting Java server performance Proceedings of the ACM 1999 conference on Java Grande, (25-34)
Contributors

Recommendations

Gonzalo Peralta Villavicencio

encourages the reader to not only learn Java, but to approach software development problems from the point of view of a language that, from its inception, incorporated object orientation (OO), concurrency, garbage collection, and portability as its most important characteristics. The book is composed of 16 chapters that cover almost all aspects of Java programming, starting from the language's foundations, and progressing toward more advanced themes. The author includes practical examples, based on the Java 2 specification and Java Development Kit (JDK) 1.4, and proposes exercises at the end of each chapter. The book is not recommended as a basic programming book; the concepts presented presuppose that the reader has experience with programming languages. The included CD, "Foundations for Java," contains Hypertext Markup Language (HTML) versions of the two first editions, and some topics not included in the third. No sources for the examples are included on the CD, but they can be accessed on the author's Web site. Chapters 1 and 2 present an overview of the topics presented later on in the book. This introduction to object-oriented programming (OOP) takes as its premise the idea that "all is an object." The reader must assimilate this principle before moving deeper into Java. In chapter 3, the author provides a complete overview of Java syntax and its basic control structures. Chapter 4 presents themes related to OOP, beginning with object initialization and destruction. This is the first difference noted when comparing Java with other programming languages: garbage collection is viewed as a main characteristic of the language. Chapters 5, 6, and 7 present classic OOP concepts from the point of view of Java, namely hiding information, reusing classes, and polymorphism. The book presents these chapters in a practical way, so the reader is encouraged to interact with the examples and exercises. Eckel covers the topics in a clear manner, in particular when talking about polymorphism, despite the fact that this topic is complicated to understand. The level of abstraction in the text increases in chapter 8, as the text begins to address advanced design topics. The concepts of interface and inner classes, which are some of the most relevant topics in Java relating to other programming languages like C and C++, are presented. Some developers who are very familiar with the use of abstract methods and callbacks will find these high-level concepts interesting. The remaining chapters develop themes that programmers must pay attention to when developing more robust systems. In chapter 9, error handling by controlling exceptions is presented. The examples in this chapter are well formulated, and teach how to lead with different kinds of exceptions. Useful recommendations are made at the end of the chapter; readers will benefit from considering these during the development stage. After a brief presentation of Java resources for runtime type information (RTTI) in chapter 10, chapter 11 addresses containers. Readers who are familiar with other libraries, like the C++ standard template library (STL), will find it easy to follow this chapter. The examples are sufficient, and the text includes a complete overview of Java container families, including arrays, collections, lists, maps, stacks, and bitsets. Java input/output (I/O) systems and resources for concurrent programming are addressed extensively in chapters 12 and 13. Both topics are foundations of the Java language. The author's discussion will prove useful to programmers who are seeking to better exploit these resources. The explanation of I/O systems includes topics about object serialization and data compression. The chapter about concurrency is particularly good. Issues about threads, critical sections, and shared resources are explained with clarity. The concept of deadlocks is excellently illustrated using the classic dining philosophers problem. The creation of graphical user interfaces (GUIs) with Java 2 Swing is addressed in chapter 14, as is the concept of an application framework for constructing applets. The text provides a complete overview of Swing components, from simple buttons to clipboards. Questions about concurrency are addressed, and a comparison to JavaBeans is made. The last part (chapters 15 and 16) covers techniques for finding and solving problems during the design and development phases with Java. A review of the resources that Java includes for unit testing, design by contracts, logging, debugging, profiling, version control, and project management is presented. These chapters also include useful guidelines to follow when using Java professionally. This book is definitely a good tool for discovering Java's OO world, and will be a complete resource for technical information for those who seek to develop advanced applications with Java. Online Computing Reviews Service

Access critical reviews of Computing literature here

Become a reviewer for Computing Reviews.