Dear Mike,
Thank you very much for your feedback.
I
sincerely apologize for the confusion caused due to the major changes in
the directory structure between the main and
nullness-checker-experiment branches. I've now resolved this by applying
all structural and unrelated changes (such as Maven integration and
folder restructuring) directly to the main branch. As a result, the
nullness-checker-experiment branch now cleanly reflects only the changes
related to the Nullness Checker—such as type annotations and
corresponding imports.
Following your suggestion, I’ve also removed redundant uses of @NonNull, recognizing that it is the default qualifier.
In
addition, I made an effort to explore the Initialization Checker and
Map Key Checker as part of this case study. I carefully went through the
documentation and examined multiple classes and methods in my codebase
to identify potential spots where these checkers might be useful. For
the Initialization Checker, I reviewed constructor flows and method
pre/postconditions to detect uninitialized fields. Similarly, for the
Map Key Checker, I analyzed the use of maps in my application,
especially in command selection and validator logic, to find suitable
variables that could be annotated with @KeyFor.
However, based on
my current understanding and after experimenting with annotations and
checker feedback, I was not able to confidently identify places where
these checkers could be applied without compilation issues. I fully
acknowledge that there might still be places in the codebase I may have
overlooked, and I’m open to revisiting these areas with further guidance
or deeper insights.
Furthermore codebase follows a modular structure:
com.damika.emailclient
├── model // Data models (Email, Recipient types)
├── factory // Factory & abstract creator dp for creating emails and recipients
├── command // Command pattern for CLI interactions
├── service // Email sending, file I/O, birthday greetings
├── util // Input validation, I/O handlers, global exception handler
├── handler // Global uncaught exception handling
└── EmailClient // Main entry point and coordinator