2012-06-13 14 views
7

Me pregunté si la nueva instrucción de bytecode invokedynamic de Java7 se podría usar para implementar multiple dispatch para el lenguaje Java. ¿La nueva API en java.lang.invoke sería útil para realizar tal cosa?Use invookedynamic para implementar despacho múltiple

El escenario en el que estaba pensando se veía de la siguiente manera. (Esto se ve como un caso de aplicación para el patrón de diseño visitante, pero puede haber razones por las que esto no es una opción viable.)

class A {} 
class A1 extends A {} 
class A2 extends A {} 

class SomeHandler { 
    private void doHandle(A1 a1) { ... } 
    private void doHandle(A2 a2) { ... } 
    private void doHandle(A a) { ... } 

    public void handle(A a) { 
     MultipleDispatch.call(this, "doHandle", a); 
    } 
} 

La biblioteca de clases MultipleDispatch entonces hacer algo por el estilo:

class MultipleDispatch { 

    public static Object call(Object receiver, String method, Object...arg) { 
     // something like that in byte code 
     #invokeDynamic "doHandle" "someBootstrap" 
    } 

    static CallSite someBootstrap { 
     // resolve that dynamic method call. 
    } 
} 

(soy consciente de MultiJava, pero es posible lograrlo de una manera Java pura?)

+0

Puede ser digno de mirar MethodHandles en Java 7, ya que pueden usar envío dinámico. –

+0

Buena pregunta (+1). ¿Falta una palabra en su primera oración (recién agregado, CallSite?)? – DaveFar

+0

Es extraño que esta pregunta tenga tan poca atención :( – DaveFar

Respuesta

2

Como no tengo experiencia con invokedynamic, no sé lo bueno que sería el rendimiento y la seguridad de tipos, pero solo puede dar algunos indicadores:

1

El invokedynamic instrucción es una instrucción puramente JVM, que no se refiere a distribución dinámica. El envío se completa con identificadores de método (el método maneja el gráfico y el método handle tree también son correctos.) Que comprende varias instancias de control de método. Una ruta en el gráfico (árbol) representa una ruta de envío.

Para su muestra dada, sería posible construir un gráfico (Diferentes personas podrían tener un resultado gráfico diferente). En este gráfico, el recorrido de los manejadores de método en el gráfico es la forma en que termina el preparado.

sample method handle tree