Guice: Los métodos predeterminados no se omiten

Creado en 22 may. 2017  ·  5Comentarios  ·  Fuente: google/guice

Las interfaces pueden tener métodos predeterminados desde Java 8. Se intentó corregir el código para ignorarlos en FactoryProvider: https://github.com/google/guice/commit/85f14e03ee00b20e20fd0f018a00ef52fcf909b1

Sin embargo, la solución no funciona porque la condición debe ser || lugar de && . (Los métodos predeterminados no son sintéticos ni puente)

Esto hace que si llama a cualquier método predeterminado en una interfaz, termine con el método proporcionado por Guice en lugar del predeterminado.

public interface FooFactory {
    Foo create();

    default Foo createWithData(Data data){ 
        Foo foo = create();  // This will never be called, even if you call `fooFactory.createWithData(data)`
        foo.addData(data);
        return foo;
    }
}

Comentario más útil

Mencionas que omitir métodos predeterminados no puente / sintéticos puede ser incompatible con versiones anteriores: estoy luchando por encontrar un caso de uso de alguien que escriba un método predeterminado, pero quiero que Guice lo anule.

Dicho esto, suponiendo que haya un caso de uso, creo que sería posible usar alguna anotación para indicar "omitir este método". No soy un gran fanático de la introducción de una anotación completamente nueva para un caso de borde pequeño como este, pero creo que funcionaría.

Todos 5 comentarios

Gracias por el informe de error Nathan, ¿hay alguna posibilidad de que esté dispuesto a enviar una solicitud de extracción (junto con un caso de prueba)?

No estoy seguro de saber cuál es la solución. _Creo_ que la solución es usar un || , pero con el compromiso, agregaron dos líneas:

validateFactoryReturnType(errors, method.getReturnType(), factoryRawType);
defaultMethods.put(method.getName(), method);

que no estoy seguro de qué hace y si se aplica a los tres tipos.

En cuanto a las pruebas, ¿a dónde iría esa prueba? Me imagino que en algún lugar de este paquete , ¿simplemente agregaría otra clase a ese paquete?

Tenga en cuenta que https://github.com/google/guice/commit/85f14e03ee00b20e20fd0f018a00ef52fcf909b1 no tenía la intención de corregir los métodos "predeterminados" por decirlo, sino de corregir los métodos sintéticos / puente que java8 creaba como métodos predeterminados. Consulte el problema (https://github.com/google/guice/issues/904) para obtener más detalles.

Dicho esto, puede ser deseable omitir los métodos predeterminados sintéticos / no puente, pero también puede ser incompatible con las versiones anteriores. Revisamos un cambio similar internamente (para referencia: cl / 148494483), pero la revisión se estancó porque no pudimos encontrar una buena respuesta sobre cómo hacer que funcione sin cambiar silenciosamente el comportamiento de las personas que podrían haber confiado en esto.

FWIW, la línea validateFactoryReturnType trata de garantizar que la visibilidad del tipo de retorno coincida con la visibilidad del tipo de fábrica; de lo contrario, java.lang.reflect.Proxy se asusta. El mensaje de ese método ofrece una buena explicación.

El mapa defaultMethods se utiliza para realizar un seguimiento de nuestros métodos predeterminados para que nuestra implementación de Proxy sepa cómo llamarlo. Hacer que esto funcione se vuelve más complejo por el hecho de que el JDK no ofrece una buena forma de llamar a un método predeterminado, por lo que tenemos que solucionarlo. La descripción de CL ofrece una buena explicación de lo que estamos haciendo aquí.

Mencionas que omitir métodos predeterminados no puente / sintéticos puede ser incompatible con versiones anteriores: estoy luchando por encontrar un caso de uso de alguien que escriba un método predeterminado, pero quiero que Guice lo anule.

Dicho esto, suponiendo que haya un caso de uso, creo que sería posible usar alguna anotación para indicar "omitir este método". No soy un gran fanático de la introducción de una anotación completamente nueva para un caso de borde pequeño como este, pero creo que funcionaría.

¿Hay algún progreso en este tema?

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

kamenik picture kamenik  ·  5Comentarios

prasanthgithub picture prasanthgithub  ·  14Comentarios

afghl picture afghl  ·  5Comentarios

scottcarey picture scottcarey  ·  17Comentarios

ronshapiro picture ronshapiro  ·  12Comentarios