LINUX.ORG.RU

True multiple dispatch!

 


0

1

[слоупок][капитан][anonimous-на-связи]

Оказывается, у нас благодаря MethodHandles еще с 7 йавы можно было не городить простыни из инстансофов (https://en.wikipedia.org/wiki/Multiple_dispatch#Java).

Вместо тысячи слов: https://ideone.com/4qdGV5

[1] https://docs.oracle.com/javase/8/docs/api/java/lang/invoke/MethodHandle.html#...

Давайте ваши ненужно. И заодно хотя бы один пример IRL, когда вам этого не хватало.

★★★★

Чем это отличается от

        return x.getClass().getMethod("f", arg.getClass()).invoke(x, arg);

?

Legioner ★★★★★ ()
Ответ на: комментарий от cdshines

Я знаю, что такое MethodHandles, я спрашиваю, чем твой вариант отличается от моего. По функционалу точно так же. По скорости в 5 раз медленней (MethodHandles медленней, чем Reflection). Какие у него преимущества?

Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

Почему медленнее? Я читал, что быстрее.

Я тебе скинул ссылки именно на те посты, где были написаны преимущества, а не описание, что это такое, возьми и почитай. Access checking и т.д.

cdshines ★★★★ ()
Ответ на: комментарий от cdshines

По твоим же ссылкам говорится что в восмерке подтянули рефлекшон и он мало отличается от MH. Но самое показательное что просадка все равно на порядок, эскобар.

anonymous ()
Ответ на: комментарий от cdshines

Ну я проверил, на моём компьютере быстрее reflection (по крайней мере в описанном примитивном варианте). Причём я даже знаю, почему быстрее: после некоторого числа reflection-вызовов JIT преобразует его в прямой вызов. С MethodHandles видимо эта оптимизация не работает.

MH в моём понимании нужен для других динамических языков (пускающихся на JVM). Для Java он не нужен. Может ошибаюсь, конечно.

А вообще я к тому, что multiple dispatch можно было испокон веков делать на reflection-е и в принципе оно более-менее нормально работает. И библиотеки есть. И при необходимости можно генерацией байткода ускорить до предела.

Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

Про испокон веков да, а в остальном надо тестить. Я щас попробую накидать, чтобы не быть голословным. Я недавно заменил рефлексию на МН в каком-то полукастомном десериализаторе, буст был раза в 2, хотя это и. экономия на спичках

cdshines ★★★★ ()
Ответ на: комментарий от Legioner

Ну если вынести дорогущий лукап (с ним разница на 2 порядка т_т), и для равновесия - getMethod, то результат такой:

Benchmark             Mode  Cnt    Score    Error  Units
Main.dynamic_mh       avgt   15  277.555 ± 48.600  ns/op
Main.dynamic_reflect  avgt   15  268.959 ± 11.173  ns/op

Почти одинаково. Интересно на 7 йаве глянуть.

cdshines ★★★★ ()
Ответ на: комментарий от Legioner

Ну в общем да, все свелось к тому, что я просто никогда не смотрел на рефлекшн как на способ это получить, а в джавадоке по МН явно написанj signature polymorphism и мне в голову пришло :)

cdshines ★★★★ ()

lookup.findVirtual(x.getClass(), «f», mt);

Я бы убивал за такие вещи:

«f»

Если юзаешь рефлекшн, то сделай enum и пропиши там поля и методы, к которым обращаешься, там же можно откоментить, зачем тебе понадобился рефлекшн для данной сущности:

lookup.findVirtual(x.getClass(), Сrutches.f, mt);

foror ★★★★ ()
Ответ на: комментарий от foror

сделай enum и пропиши там поля и методы, к которым обращаешься, там же можно откоментить, зачем тебе понадобился рефлекш

Это, конечно, решает для примеров на ideone, убийца ты наш диванный.

cdshines ★★★★ ()
Ответ на: комментарий от cdshines

По первой ссылке

One alternative to Reflection is to generate a class file dynamically

Где можно про это почитать, посмотреть примеры.

barberry ★★ ()
Ответ на: комментарий от Legioner

MH в моём понимании нужен для других динамических языков

Его для лямд используют

anonymous ()
Ответ на: комментарий от anonymous

Кстати да, если глянуть javap сотвсеми подробными опциями, МН там в конце будут рядом с LambdaMetaFactory.

cdshines ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.