En Java, defino una clase abstracta con métodos concretos y abstractos, y tiene que ser subclasificada de forma independiente por desarrolladores externos. Solo para estar seguro: ¿hay algún cambio que pueda hacer en la clase abstracta que sea compatible con sus clases pero no compatible con binarios? En otras palabras: después de que hayan compilado sus subclases, ¿podría cambiar la clase abstracta, aparte de, p. agregarle un método abstracto o eliminar un método protegido de él que se llama por subclases, que por supuesto son incompatibles, de una manera que podría obligarlos a recompilar sus subclases?Java: compatibilidad binaria de clases y subclases abstractas
Respuesta
Si no es demasiado tarde para cambiar su sistema, sugeriría que se hace eso. Anulación generalmente no es una buena manera de personalizar la funcionalidad, ya que es increíblemente frágil. Por ejemplo, si más adelante utiliza un nombre de método que sus clientes han usado (que ahora están anulando de forma no intencionada), entonces es posible que la anulación rompa completamente las invariantes de su clase. Una forma usualmente mejor de proporcionar personalización es proporcionar a sus clientes una interfaz que se limita al comportamiento personalizado, y luego tiene una clase totalmente concreta que depende de una instancia de esta interfaz, y delega adecuadamente en la interfaz cuando necesita usa los comportamientos personalizados De esta forma, su código y el código de su cliente están completamente separados, y no interferirán entre sí.
Sure.
Puede utilizar accidentalmente un nombre de método que haya usado, que ahora se reemplaza de repente, con resultados tal vez dramáticamente diferentes.
Puede agregar campos a la clase que desordenar serialización etc.
Supongo que está utilizando "incompatibilidad binaria" en el sentido técnico; p.ej. donde el cargador de clases detecta la incompatibilidad y se niega a cargar las clases.
incompatibilidad binaria también podría introducirse si se ha añadido un método visible y declaró final
, y que el método chocó con la firma de algún método existente en una subclase de terceros. Sin embargo, si el método no es final, el método existente se convertirá en una anulación de su (nuevo) método que podría causar problemas ... pero no la incompatibilidad binaria.
Del mismo modo, agregar nuevos campos visibles dará lugar a la ocultación, puede dar lugar a un comportamiento confuso y romperá la serialización de objetos. Pero esto no dará como resultado una incompatibilidad binaria.
En general, esto apunta al hecho de que debe tener en cuenta los problemas semánticos de la aplicación, así como la compatibilidad binaria simple. Y el sistema de tipo Java no lo ayudará allí.
Para completar, hay otras cosas que usted puede hacer en su código que romperían la compatibilidad binaria para las clases de 3 ª parte:
- reducir la visibilidad de su clase abstracta y/o de sus métodos,
- cambio de las firmas de otras clases utilizadas como resultado de parámetros y tipos de excepción,
- cambio la cadena de superclases que se extiende a su clase abstracta, o hacer un cambio incompatible en esas clases, o
- cambia el árbol de interfaces de t que su clase abstracta implementa, o hacer un cambio incompatible en esas interfaces.
Gracias por la respuesta integral y por pensar en lo que también pensé pero no describí, es decir, en cualquier otra forma de romper el código de los implementadores. – thSoft
Buena respuesta. Las reglas para la compatibilidad binaria y fuente son muy independientes entre sí. Es importante entenderlos por separado. http://motlin.com/2010/binary-and-source-backwards-compatibility/ –
- 1. ¿Mejor práctica para presentar clases y subclases abstractas?
- 2. Métodos refactorizados y compatibilidad binaria en Java
- 3. Registro de Java con clases abstractas
- 4. JAXB y clases abstractas
- 5. CSS Clases y subclases
- 6. ¿Por qué no serializar clases abstractas en Java?
- 7. Java: variables finales en las clases abstractas
- 8. sun.org.mozilla Rhino y se extienden las clases abstractas Java
- 9. Java genéricos, genéricos extendidas y las clases abstractas
- 10. Qt interfaces o clases abstractas y qobject_cast()
- 11. Compatibilidad binaria de contenedores STL
- 12. de Python(), las clases base abstractas y NotImplementedError
- 13. ¿Múltiples clases abstractas derivadas?
- 14. AS3 - clases abstractas
- 15. Interfaces vs. clases abstractas
- 16. Clases selladas abstractas
- 17. Grandes clases base abstractas
- 18. ¿Constructores en clases abstractas?
- 19. Pruebas unitarias clases abstractas y/o interfaces
- 20. Clases abstractas y Spring MVC @ ModelAttribute/@ RequestParam
- 21. Comprender el propósito de Clases abstractas en Java
- 22. Especificidad de destino de GCC y compatibilidad binaria
- 23. estilo de código Java - Interfaces vs. clases abstractas
- 24. compatibilidad binaria entre las distribuciones de Linux
- 25. Cómo crear propiedades abstractas en las clases abstractas de Python
- 26. Clases abstractas en relaciones GORM
- 27. "Interfaces y clases abstractas innecesarias en Ruby" -> ¿Alguien puede explicar?
- 28. ¿Podemos crear clases abstractas estáticas públicas en java?
- 29. ¿Por qué las clases abstractas en Java tienen constructores?
- 30. ¿Por qué crear clases e interfaces abstractas?
¡Gracias también por proporcionar la alternativa!Eso también era lo que estaba considerando: estaba sopesando sus costos en complejidad (manteniendo una referencia a la implementación y delegándola) pero dado que esta arquitectura conectable es un requisito, lo haré. – thSoft