Cada clase implementa una interfaz (es decir, un contrato) en la medida en que proporciona una API no privada. Si debe elegir representar la interfaz por separado como una interfaz Java depende de si la implementación es "un concepto que varía".
Si está absolutamente seguro de que solo hay una implementación razonable, entonces no hay necesidad de una interfaz. De lo contrario, una interfaz le permitirá cambiar la implementación sin cambiar el código del cliente.
Algunas personas gritarán "YAGNI", asumiendo que usted tiene control total sobre el cambio del código en caso de que descubra un nuevo requisito más adelante. Otras personas sentirán justamente temor de que tengan que cambiar lo inmutable, una API publicada.
Si no implementa una interfaz (y utiliza algún tipo de fábrica para la creación de objetos), ciertos tipos de cambios le obligarán a romper el Principio de Open-Closed. En algunas situaciones esto es comercialmente aceptable, en otros no lo es.
¿Puede describir una situación en la que no es una buena idea usar interfaces?
En algunos idiomas (por ejemplo, C++, C#, pero no en Java) puede obtener un beneficio de rendimiento si su clase no contiene métodos virtuales.
En programas pequeños, o aplicaciones sin API publicados, entonces puede ver un pequeño costo para mantener interfaces separadas.
Si ve un aumento significativo en la complejidad debido a la separación de la interfaz y la implementación, entonces probablemente no esté utilizando las interfaces como contratos. Las interfaces reducen la complejidad. Desde la perspectiva del consumidor, los componentes se convierten en productos que cumplen con los términos de un contrato en lugar de entidades que tienen detalles de implementación sofisticados por derecho propio.
relacionadas: https://www.symphonious.net/2011/06/18/the-single-implementation-fallacy/ – jaco0646
relacionadas: https://marekdec.wordpress.com/2011/12/06/explicit-interface-per-class-antipattern/ – jaco0646
Relacionado: http://martinfowler.com/bliki/InterfaceImplementationPair.html – jaco0646