Have you heard of the Model-View-Controller model? It's nothing fancy but maybe it could help. Basically your program will have three parts:
- Model - These are all of the italicized words in your question, that represent the parts of the program that interact to comprise it.
- View - Display; not as relevant here, it's just like how things are drawn onto the screen
- Controller - This is what I think will help you. This is a class that runs the whole show. This class controls all of the parts generated in the Model component of the program and this is what allows them to communicate. I imagine the Environment class may be good for this in your case.
Your controller class may contain arrays/ArrayLists that contain all of the parts generated during the game, like the CollisionBoxes. Each CollisionBox (I'm just using this as an example) could have an instance variable (call it id maybe) that represents its position in the array (it could be as simple as the index, an int). When two Boxes collide, you could call a method in the controller class that takes the two ids, and conveniently these ids would refer to where they are in the array. Of course, you could use other data structures, but I hope this gives you the basic idea.