Java holds a special place in my heart because it was always the "teaching language" of choice at Drexel. It's how I learned OOP and classes, good design principles, and the beauty of things like libraries and serialization. Below are my two largest and most impressive Java projects.
Most of the CS majors I've worked in groups with absolutely hate UML, and CS-350 is the reason why. It was the first time we were exposed to the concept of design patterns, including recognition, memorization, and yes, usage. CS-350 is a project class, where the end result is a digital questionnaire system capable of creating, displaying, modifying, saving, loading, taking, and finally tabulating both surveys and tests (the difference being that tests have "correct" answers which are considered as part of the tabulation). The catch was that we didn't know our final system would have to do all of these things when we started, so the challenge was to design and write the code in such a way that it could be easily extended to include new features and question types. Extended, not modified. Part of our grade at each step was based on how much our design changed from the previous one. I feel like it took me much longer to pick up this class' material than any other, but by the end, I had learned the important lessons about coupling vs. cohesion and the correct ways to use inheritance and composition. The Digital Questionnaire system was run from the console, so there's nothing exciting to show, but here's my final design:
A few years later, I took a class on human-computer interaction (read: user interface), and we concentrated mainly on a design pattern especially prevalent for apps with large visual components: Model-View-Controller. In this pattern, the data and all operation code (the "model") is written in one place, while the graphics code controlling everything the user sees (the "view) is abstracted and kept separate. The "controller" is what causes either or both of the other two to update themselves, and mainly includes event handlers. It was an interesting challenge to layer this model on top of my object-oriented upbringing, all the while trying to learn Java Swing for the GUI, but I took the time to do it correctly, and I often look back to my final project as an example when I need a refresher on MVC.
My project was conceived to answer the frequent student question, "What do I need to get on the final to get the grade I want in the class?" MyGradebook logs student grades and keeps a running average using configurable weights. Users can calculate their current grade at any time, and can enter “predicted” grades to see their effects. I backed into the math formulas behind these operations by doing many, many examples by hand. My "model" includes a hierarchy of Classes composed of Categories composed of Grades, with instances of each able to be created, modified, and deleted at any time. My "view" is all the Java Swing code, including liberal use of JPanels, a flipping CardLayout, and a faked accordion view that I wrote myself when I couldn't find a default implementation with all the functionality I wanted. My "controller" is made up of all the JButtons' ActionListeners and features robust error checking of any entered information, from preventing duplicate names to ensuring all weights total 100. I'm very pleased with how the app turned out, but it still has one major shortcoming: I ran out of time to implement serialization, so all grade data and calculations are lost when the app closes. This last detail is something I still hope to go back and finish one day.