Java redeclare interfaces heredadas?

7

Mientras trabajaba en una clase pequeña llamada FractionNumber , me pregunté si debería implementar una interfaz que ya esté implementando. Suena estúpido, lo sé, pero ten paciencia conmigo.

Mi clase FractionNumber extiende Number ; Number implementa Serializable . Y no estoy seguro de que FractionNumber también implemente explícitamente Serializable .

Por supuesto, realmente no importa porque Serializable solo define los métodos finales y FractionNumber hereda la "implementación" Serializable de Number . Pero me gusta hacer mi FractionNumber explícitamente Serializable .

Ahora a mi pregunta: ¿es esto simplemente inútil o la verbosidad ayuda de alguna manera? ¿Tiene sentido, en un sentido filosófico, declarar que FractionNumber es algo que ya es?

    
pregunta kalsowerus 28.07.2016 - 09:08

2 respuestas

3

Desde el punto de vista del código

Los contratos establecidos por el tipo principal deberían estar implícitos para el subtipo.

Si siente la necesidad de expresar las capacidades de serialización en todos los tipos que pueden ser serializados (tal vez sienta que necesita recordarse explícitamente / a los co-desarrolladores que algo puede ser serializado) debe refactorizar su Código para reforzar la implicación.

Desde un punto de vista JavaDoc

Todas las interfaces implementadas por el tipo, incluidas las interfaces heredadas , se muestran en el encabezado en " Todas las interfaces implementadas ". La única diferencia es la declaración real que se muestra en el JavaDoc:

Si implementa la interfaz directamente :

public class Sub extends Super implements Serialization

Si se hereda :

public class Sub extends Super

Para mí, esto es un desorden (duplicación), y lo recomiendo en contra.

    
respondido por el Vince Emigh 01.11.2016 - 06:07
1

En general, probablemente no debería volver a declarar que implementa interfaces de esta manera, pero Serializable no es una interfaz normal. Dice que " Serializable solo define los métodos finales", pero ese no es el caso ( Lo verifiqué ). Serializable declara no tener ningún método. Es una interfaz de marcador que se considera ampliamente como un antipatrón y estoy totalmente de acuerdo con esa evaluación.

El hecho de que su clase debe ser serializable porque una super-clase (o interfaz) implementa Serializable es un artefacto uno de los defectos de diseño más importantes en Java. Serializable se especifica usando una interfaz pero transient es una palabra clave. Por qué serializable no es una palabra clave también es un rasguño de cabeza. Si ahora se diseñara la serialización de Java, probablemente se haría con anotaciones.

Debido a todo este error, si va a implementar Serializable , seguiré adelante y lo volveré a declarar para demostrar que realmente tiene la intención de trabajar con la serialización java y que no es Serializable porque simplemente es una base. La clase fue declarada de esa manera. Personalmente, no usaría la serialización Java, sin embargo. Hay muchas formas mejores de crear wireformat y creo que la idea de "transmisión de objetos" es inherentemente defectuosa.

    
respondido por el JimmyJames 01.11.2016 - 20:20

Lea otras preguntas en las etiquetas