La respuesta corta es que no hay nada en Java lo más cerca que quisieras, pero hay alternativas. El patrón de delegado no es difícil de implementar, simplemente no es tan conveniente como hacerlo con Objective-C.
La razón por la cual los "protocolos informales" funcionan en Objective-C es porque el lenguaje admite categorías, que le permiten agregar métodos a clases existentes sin crear subclases, o incluso tener acceso al código fuente. Por lo tanto, la mayoría de los protocolos informales son una categoría en NSObject. Esto es claramente imposible en Java.
Objective-C 2.0 opta por los métodos de protocolo @optional, que es una abstracción mucho más limpia y preferida para el nuevo código, pero aún más lejos de tener un equivalente en Java.
Honestamente, el enfoque más flexible es definir un protocolo delegado, luego las clases implementan todos los métodos. (Con IDEs modernos como Eclipse, esto es trivial.) Muchas interfaces Java tienen una clase de adaptador acompañante, y este es un enfoque común para no requerir que el usuario implemente muchos métodos vacíos, pero restringe la herencia, lo que hace que el diseño del código sea inflexible . (Josh Bloch aborda esto en su libro "Effective Java"). Mi sugerencia sería que solo proporcione primero una interfaz, luego agregue un adaptador si es realmente necesario.
Hagas lo que hagas, evita arrojar un UnsupportedOperationException
por métodos "no implementados". Esto fuerza a la clase delegante a manejar excepciones para métodos que deberían ser opcionales. El enfoque correcto es implementar un método que no hace nada, devuelve un valor predeterminado, etc. Estos valores deben estar bien documentados para los métodos que no tienen un tipo de retorno nulo.
Lanzar 'UnsupportedOperationException' es una idea terrible! Las API nunca deben obligar a los usuarios a tratar con excepciones en los patrones de uso normales, solo para un flujo excepcional. El patrón delegado en Cocoa es robusto porque pasa silenciosamente sobre los métodos delegados no implementados. –
Muy buen punto. Había olvidado lo molestas que son las excepciones de Java. –
@Quinn Taylor: sin embargo, así es como se han realizado * protocolos * opcionales en muchas partes de la biblioteca de Java. Por ejemplo, la interfaz "Colección" especifica que los métodos como add() y remove() son "operaciones opcionales", que arrojan UnsupportedOperationException si no lo admiten. – newacct