java interface java-8 private-members

¿Por qué `private static` field no está permitido en la interfaz Java 8?



interface java-8 (4)

El objetivo de la interfaz es definir algo implementado por otras clases. Un campo privado no define nada ya que no es visible fuera de la interfaz. Por lo tanto, no tiene ningún sentido en esta construcción. Puede ser que algunos hacks la usen (tal vez desde las clases internas de la interfaz) pero de todos modos no se vería como un buen diseño.

Si realmente implementa parte de la funcionalidad, use clase abstracta en su lugar.

Cuando intento compilar el siguiente código

public interface SomeInterface{ private static Logger logger = Logger.getLogger(); public default void someMethod(){ logger.info("someMethod: default implementation"); } }

Me sale un error

Illegal modifier for the interface field SomeInterface.logger; only public, static & final are permitted

Cuando elimino private modificador private , el código se compila, pero no quiero que otras clases del paquete vean este campo.

¿Por qué Java no me permite hacer tal cosa cuando realmente tiene sentido?


La interfaz es como un modelo de cualquier clase, donde declaras a tus miembros. Cualquier clase que implemente esa interfaz es responsable de su definición. El miembro de la misma clase solo puede acceder a los miembros privados, lo cual no tiene sentido en términos de interfaz. Los miembros protegidos pueden ser accedidos por el mismo miembro de la clase y los miembros heredados de la clase, pero en el caso de la interfaz nunca ampliamos una interfaz, lo implementamos. Entonces, cualquier interfaz solo puede contener métodos públicos en general,


Las interfaces no son clases. No tienen un estado privado. Incluso un registrador público en la interfaz es un olor de diseño y un abuso de las interfaces.

El caso de uso para los campos estáticos en las interfaces es principalmente para las constantes de tiempo de compilación, no para los objetos con estado.


En la vista previa del mundo de Java 8, las interfaces eran puramente para contratos de interfaz, y los miembros privados existen puramente para la implementación, por lo que esta restricción era completamente sensata.

En el mundo posterior a Java-8, donde las interfaces pueden llevar el comportamiento (pero no el estado), comienza a ser razonable preguntar si otras características de las clases deberían aplicarse también a las interfaces. (Sin embargo, el hecho de que algo sea "razonable" no significa que deba ser respaldado, a menudo hay más de una forma razonable de construir el mundo).

En Java 9, se admitirán métodos privados en interfaces.