В Java, как и в Scala (автор статьи, Li Haoyi, хорошо известен Scala сообществу) не может быть использован алгоритм Hindley–Milner, так как HM не поддерживает sub-typing.
На эту тему у Nitsan Wakart есть прекрасная статья (я думаю вы её уже видели).
Ещё раз спасибо за статью :) Ну и по теме.
Я, таки, попробовал на ArrayList'e из одного / двух элементов — там таких эффективных оптицизаций нет.
За то если параметр заменить на String[] — testIterator(String[] array) и передавать туда new String[] { «abc» }, то он вообще схлопывается в константу «3», а внешний цикл на 1 000 000 итераций анроллится (хотя я техническое дно в ASM и могу ошибаться).
Проверяемые исключения также можно выбросить используя: Unsafe.getUnsafe().throwException(new SQLException()) ну или с помощью deprecated-метода: Thread.currentThread().stop(new SQLException());
По-моему это очевидно и без бенчмарков. Аналогично и для коллекций: указание примерного размера при создании ArrayList / HashSet / HashMap etc. дает ощутимый выигрыш в производительности.
Как вариант, просто скопировать tools.jar к библиотекам проекта. Он конечно большой по размеру (в JDK 1.8.05 — 18 Мб), но при большом желании можно повыкидывать оттуда javap, jstack, jmap, jps и прочие ненужные вещи.
Забавно, что «non-sealed» — это первый keyword c дефисом, хотя JEP Keyword Management for the Java Language так и остался в статусе черновика.
Ещё раз спасибо за статью :) Ну и по теме.
Я, таки, попробовал на ArrayList'e из одного / двух элементов — там таких эффективных оптицизаций нет.
За то если параметр заменить на String[] — testIterator(String[] array) и передавать туда new String[] { «abc» }, то он вообще схлопывается в константу «3», а внешний цикл на 1 000 000 итераций анроллится (хотя я техническое дно в ASM и могу ошибаться).
Он подробно рассказывает о том, как будет «изыматься» sun.misc.Unsafe с попутным введением нормального API с тем же функционалом.
Как вариант, просто скопировать tools.jar к библиотекам проекта. Он конечно большой по размеру (в JDK 1.8.05 — 18 Мб), но при большом желании можно повыкидывать оттуда javap, jstack, jmap, jps и прочие ненужные вещи.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
А что в .NET / Mono нет нормальной интернационализации (i18n)? А то уж как-то совсем сурово: github.com/atauenis/fcmd/blob/master/Localizator.cs