Designing Data Structures in Java: A Software Engineering Approach