Finalize is worse than you think.
First, it isn't even guaranteed to be called. When the program shuts down, Finalizers can be skipped. Second, consider shutting down the current world, the save() routines are called, and then objects are destroyed, and finalizers want to do ... what?
Third, consider a case of a chunk unloading. You save the active items into the save file, garbage collect the chunk, finalize the objects, and ... now what is it supposed to do?
It's potentially worse. The objects/entities want to know where they are, so they are referencing the chunk somehow. Garbage collection can still find this -- the loop of objects is not referenced anywhere else, so eventually (key: eventually; it takes a major collection [full GC in the classic/throughput collector] which can be very very long later) it wants to be removed. So now what happens? You've got an object referencing a chunk that is not active, mostly forgotten, but still in memory. What next?
Finalize is really a very badly designed language mechanism. I haven't even gotten into the worst aspect of it. Normally, object destructors are called when an object goes bye-bye, and the object is going to go bye-bye. Finalize is called when the object is detected as having no more references, and the routine has the ability to give it a reference.
Yea, you can take "this", and store it somewhere, and your "dead" object is back to life. Even if it is now referencing an inactive chunk, now "live", and consuming memory, with an entity referencing it, but potentially none of the other data that minecraft is tracking about the chunk up to date.
That's a complexity that really made it difficult to write a good garbage collector, by the way. It was less of an effect on the early "stop the program, clean up everything, resume" things. But knowing that an object is "ready to be destroyed" simply means "ok, mark it for later, we have to call code and give it a chance to come back to life, we can only actually remove it if it is still dead after all that code is called and run". I read (a while back, probably the J4 or 5 days) about how much that made the CMS collector significantly harder to make work properly.
===
So there's no way to make an object that cannot go into a chest? Hmm. Ok, how do you get some inventories that can only take certain objects? Does forge have an event bus action for "Can this object go into this container"? (And if not, why not???). Can that be extended to vanilla chests?
No? Alright. What about your basic minecarts? They're entities, they exist in the world, and they have an item form. So there's something that turns them from world-things to item-things. So lets remove that "conversion" -- ... oh, wait, that doesn't solve it, because at some point, you are going to be carrying the waste container with the waste entity inside it, and it's back to being an inventory item. Hmm...
(I'll go with not worth solving as well