Статьи

Через год после выпуска Java 8 IDE и компиляторы еще не полностью готовы

Год назад, 18 марта 2014 года , была выпущена Java SE 8, а вместе с ней — блаженство функционального программирования с помощью лямбда-выражений и API потоков . Это были отличные новости для всей нашей экосистемы Java, и многие люди уже выполнили обновление до Java 8. Переполнение стека уже дает почти 2500 вопросов о Java 8 ( ответил сам Брайан Гетц ). Кроме того, Google Trends показывает значительное увеличение объема поиска

Java-8-тенденции

Но даже спустя год ни компилятор javac, ни три основных компилятора IDE еще не полностью готовы к Java 8. Этот вопрос пользователем meriton был недавно задан на переполнении стека:

Вывод типа лямбда выводит тип исключения, не выбрасываемый лямбда

Вопрос показывает следующий кусок кода:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class TestException extends Exception {
}
 
interface Task<E extends Exception> {
    void call() throws E;
}
 
public class TaskPerformer {
 
    private <E extends Exception> void perform(Task<E> task) throws E {
        task.call();
    }
 
    public static void main(String[] args) {
        // compilation error
        new TaskPerformer().perform(() -> {
            try {
                throw new TestException();
            } catch (TestException e) {
                return;
            }
        });
    }
}

Ложная положительная ошибка компиляции, вероятно, была исправлена ​​с проблемой 429430 . В любом случае, это не воспроизводится с Eclipse 4.5.0 M5, доступным как сборка для разработчика

В Java 8 компиляция кода Java не стала намного проще, чем раньше. Вышеуказанная ошибка была вызвана очень тонкой комбинацией:

  • Проверенные и непроверенные исключения
  • Дженерики (и исключения)
  • Лямбда-выражения
  • Тип вывода
  • Анализ потока

Если вы когда-либо просматривали исходный код компилятора, вы не можете не радовать, что кто-то другой выполняет эту работу за вас ( кстати, то же самое верно, когда вы смотрите на исходники jOOQ или Hibernate ).

Где мы с нашими компиляторами?

Мы добираемся туда. По моим личным ощущениям, ранние выпуски javac работают лучше всего. Например, я использую

1
build 1.8.0_40-ea-b23

(Отказ от ответственности: эта статья была написана до того, как была опубликована. Теперь с 1.8.0_40 ушло много проблем)

… Хотя, вы, вероятно, не хотите выходить в производство с таким ранним выпуском доступа. IDE, работающие с javac, и Maven, конечно, работают одинаково хорошо. Затмение немного отстает — что иногда может раздражать.

Некоторые из вас, не являющиеся пользователями Eclipse, могут ухмыльнуться и получить готовые выступления Eclipse против IntelliJ, и вы знаете … об этом говорят:

Веган, пользователь IntelliJ, пользователь Mac и пользователь Linux вошли в бар.

Откуда мне знать?

Через 2 минуты весь штопор штанги знал!

(На самом деле у нас есть целая статья на эту тему )

Дело в том, что все команды компиляторов прилагают все усилия, чтобы исправить множество ошибок. IntelliJ даже при использовании javac для компиляции может по-прежнему отображать некоторые ложные срабатывания визуально в вашей IDE. Geertjan из NetBeans недавно исправил целую кучу ошибок, о которых мы сообщали . И Eclipse, ну, Eclipse поставляется со своим собственным очень сложным инкрементным компилятором Java. Это отличный компилятор для быстрого создания прототипов, но недостатком является то, что он компилирует вещи немного иначе, чем другие.

При разработке jOOQ, а также jOOλ , мы обнаружили довольно много ошибок в Eclipse — многие из них уже исправлены в Eclipse Mars. Например:

Мы добираемся туда. Если вы можете, используйте лямбды и потоки и применяйте как можно больше выводов типов в своем коде. И, пожалуйста, если вы обнаружите ошибку, сообщите об этом. Вероятно, мы все используем одну из этих трех IDE. Каждая ошибка, о которой вы сообщаете, является еще одним препятствием на пути принятия Java 8.

Вот ссылки для начала регистрации ошибок: