In what I've seen across a couple languages:
- new() acts as the constructor. It handles the physical building of the object, blessing it, and all that. new() is not supposed to be overloaded by children.
- init() acts as the initializer. It handles validation of the inputs to new(), setting the right values, and the like. init() is supposed to be overloaded by children. The base class will often provide a basic implementation, but may only provide a stub.
As for accessing objects that already exist, that does sound like something new() should do, in the sense that it needs to create the physical representation of the object. But, init() should handle the setting of attributes according to the fact that this is a load-from-datastore and not an insert-into-datastore.
My criteria for good software:
- Does it work?
- Can someone else come in, make a change, and be reasonably certain no bugs were introduced?