This is a very controversial issue. In short, not there - at least for you, the developer.
In the EJB2 world, the Home and Remote interfaces were mandatory, and it was for some reason that @AravindA mentions: proxies. Security, remote access, pooling, etc. All can be wrapped in a proxy server and provide services requested strictly in the standard library (as in DynamicProxy ).
Now that we have javaassist and cglib , Spring (Hibernate, EJB3, if you prefer), do a great job with your classes, as the framework developers like. The problem is that they do very unpleasantly: they usually ask you to add a constructor without parameters. - Wait, did I have parameters here? - Incredible, just add a constructor.
Thus, the interfaces are designed to maintain your sanity. However, this is strange, a constructor without arguments for a class with an appropriate constructor is not something that makes sense to me, is it? It turns out (I should have read the specification, I know) that Spring creates the functional equivalent of an interface from your class: a stateless instance (or ignored) and all overridden methods. So you have a “real” instance and a “fake interface”, and what fake interface it does, it serves as all your protection / transaction / deletion. Nice, but hard to understand, and looks like a mistake if you haven’t figured it out.
In addition, if you have to implement an interface in your class, (at least some versions) Spring will suddenly decide that you are going to proxy only this interface, and the application simply does not work for no apparent reason.
Thus, the reason is still that security and sanity. There are reasons why this is good practice, but from your post, I see you have already read all this. The most important reason that I see today is the WTH / minute indicator, especially if we are talking about new participants in your project.