Подтвердить что ты не робот

В GWT почему метод не должен возвращать интерфейс?

В это видео из Google IO 2009, ведущий очень быстро говорит, что подписи методов должны возвращать конкретные типы вместо интерфейсов.

Из того, что я слышал в видео, это как-то связано с компилятором GWT Java-to-Javascript.

  • В чем причина этого выбора?
  • Что делает интерфейс в сигнатуре метода для компилятора?
  • Какие методы могут возвращать интерфейсы вместо конкретных типов и лучше ли возвращать конкретные экземпляры?

Snippet of code from Google IO presentation showing it's better that your method returns ArrayList than List

4b9b3361

Ответ 1

Это связано с gwt-компилятором, как вы говорите правильно. EDIT: Однако, как отметил Даниэль в комментарии ниже, это не относится к gwt-компилятору в целом, но только при использовании GWT-RPC.

Если вы объявляете List вместо ArrayList в качестве возвращаемого типа, gwt-компилятор будет включать в свой скомпилированный код полную List-hierarchy (т.е. все типы, реализующие List). Если вы используете ArrayList, компилятору нужно будет включить иерархию ArrayList (т.е. Все типы, реализующие ArrayList, который обычно является просто ArrayList). Используя интерфейс вместо конкретного класса, вы будете платить штраф за время компиляции и размер вашего сгенерированного кода (и, следовательно, количество кода, которое каждый пользователь должен загружать при запуске вашего приложения).

Вы также просили причину: если вы используете интерфейс (а не конкретный класс), компилятор не знает во время компиляции, какие реализации этих интерфейсов будут использоваться. Таким образом, он включает в себя все возможные реализации.

Что касается вашего последнего вопроса: все методы CAN могут быть объявлены для возврата интерфейса (это то, что вы говорите, правильно?). Однако применяется вышеуказанное наказание.

И к слову: как я понимаю, эта проблема не ограничивается методами. Он применяется ко всем объявлениям типа: переменные, параметры. Всякий раз, когда вы используете интерфейс для объявления чего-то, компилятор будет включать полную иерархию суб-интерфейсов и классов реализации. (Так что, очевидно, если вы объявляете свой собственный интерфейс только с одним или двумя классами реализации, вы не подвергаетесь большому штрафу. Вот как я использую интерфейсы в GWT.)

Короче: используйте по возможности конкретные классы.

(Небольшое предложение: это помогло бы, если бы вы дали отметку времени, когда ссылаетесь на видео.)

Ответ 2

Это и другие рекомендации по производительности были представлены в Google IO 2011 - Высокопроизводительный GWT.

Примерно через 7 минут вызывается адрес RPC Type Explosion: #4 Watch out for RPC type explosion

По какой-то причине я думал, что компилятор GWT оптимизирует его снова, но кажется, что я ошибся.