I think not exposing the JID is an oversight. AbstractComponent is an implementation that I have been using for years, but I never had to use the JID of the component itself. Nonetheless, as it is provided by the Component interface, I feel we should expose it in AbstractComponent too. I've filed TINDER-36 to track the required changes.
As for the question why initialize() is final: We will introduce monitoring functionality, that is going to be initialized in that method. If a subclass overrides it, the soon-to-be-added functionality will fail. In anticipation, the initialization method was made final. To provide developers a similar hook, the pre- and postComponentStart() methods were introduced. Their usage pattern is slightly different (it's based on Component#start() rather than initialize() ) but this too was done intentionally: Component#start() can be "undone" with Component#shutdown() which is handy when developing a component that needs to be restartable. There is no such "undo" method for initialize().