Significado de sentencia Java

cabron

Hola

En un trozo de código tengo una sentencia Java que me ha dejado a cuadros, es una cosa así:

gs.acquireServiceByName(new IRequesterId(){public String getRequester(){// getRequester
return GENERADOR_INFORMES; }}, RIGEL_RESOURCE);

LLama a un método, y en el primer parámetro, se instancia un objeto, y se mete una función que devuelve un valor :?

Me he quedado así O_O, pero el caso es que funciona. ¿Alguien sabe que hace exáctamente esa sentencia?

Gracias.

T

gs.acquireServiceByName(new IRequesterId(){
public String getRequester(){
return GENERADOR_INFORMES; }}, RIGEL_RESOURCE);

Así a bote pronto juraría que lo que hace es sobrecargar/definir en la misma línea de código un método de la clase IRequesterId() que retorna un objeto de la clase.

A la función acquire se le pasaría este retorno de la función definida respecto de la clase y el otro parámetro (Rigel_source)

Pero vamos, a ver si alguien aclara esto.

cabron

Um, hasta donde yo sé, solo puedes sobreescribir los métodos de una clase, en la declaración de la subclase, no me cuadra mucho ese de redefinir una función en los parámetros de una llamada a otra función.

Es que no entiendo en absoluto que hace esa línea, nunca había visto nada parecido, y es que no tengo ni idea de que poner en un buscador para intentar encontrar alguna explicación :?

T

Quizás haciendo unas clases muy sencillas se podría probar hasta dar qeu hay que hacer exactamente y ver como funciona

cabron

Bueno, al final he conseguido encontrar el signficado.

Básicamente consiste en declarar una clase e instanciarla en una sola sentencia. Me explico:

IRequesterId es una interfaz, que tiene como único método String getRequester(). El código:

new IRequesterId(){public String getRequester(){ getRequester
return GENERADOR_INFORMES; }

Lo que hace es crear una clase sin nombre, que hereda de la clase Object, y que implementa la interfaz IRequesterId. Lo que sigue es la implementación del método para la interfaz. Además se instancia automáticamente un objeto de esta nueva clase sin nombre.

Al evaluarse, lo que queda es la instancia de la clase sin nombre, que se pasa como parámetro al método gs.acquireServiceByName()

Bueno, ahora ya tiene más sentido, es simplemente una forma rebuscada de crear una clase que solo se va a instanciar una vez, y por tanto no se quiere tener una declaración de la clase aparte.

maRc

Vaya, ahora que lo vuelvo a ver, esta es la manera con la que el Visual Editor de Eclipse te crea los esbozos de los manejadores de eventos.

Usuarios habituales