Сегодня я решил поздороваться с Xtend. Я хотел выучить новый язык программирования. Список критериев выбора одного был не таким уж большим.
- Это должен быть язык программирования, работающий на JVM,
- и было бы неплохо, если бы мне не нужно было изучать совершенно новую эко-систему для создания приложений.
Я проверил несколько вариантов. Список языков программирования для JVM довольно большой, но я решил выбрать между следующими: Groovy, Scala и Xtend. На и я выбрал Xtend.
Scala не подходил под мои критерии, с другой стороны, groovy соответствует моим критериям, но это будет следующий язык программирования, который я выучу после Xtend. Трудно объяснить, почему я выбираю Xtend. Я даже не думаю, что Xtend — это язык программирования, это больше похоже на расширение, но это мое мнение.
Что такое Xtend
Итак, несколько слов о языке. Для получения дополнительной информации перейдите на веб-страницу Xtend . Это красивый и простой язык, который модернизирует Java. Вместо скомпилированного байтового кода Xtend переводится в класс Java с красивой печатью, что делает его подходящим для работы с платформами, которые не работают с байтовым кодом, таким как GWT. Код, написанный на Xtend, создает классы Java, как я уже упоминал, поэтому нет никаких ограничений в использовании любой существующей среды Java. Язык создан с помощью Xtext, поэтому он поставляется с уже подготовленным Eclipse, и для этого языка есть плагины maven, поэтому его использование вне Eclipse не будет проблемой.
Учусь
Изучать Xtend не сложно. Существует несколько изменений синтаксиса и несколько новых концепций семантики, которые в настоящее время отсутствуют в Java. Нет ничего революционного по сравнению с другим языком программирования, Xtend просто расширяет Java новой функцией, которая позволит вам создавать более приятные и короткие классы. Особенностями, которые привлекают мое внимание, были закрытие, лямбда-выражение и расширения. Эти вещи позволяют создавать действительно хорошие классы для строителей. Вы можете легко создать UI Builders API, который позволит вам создать более простое представление (не в контексте функциональности, а в контексте понимания кода).
Вовлечение Xtend
Я уже упоминал, что Xtend собран с Xtext, а это значит, что eclipse уже способен правильно обрабатывать язык Xtend. После создания нового класса Xtend eclipse будет жаловаться на отсутствующие библиотеки и предложит вам добавить их в путь к классам, если вы не используете maven для получения зависимостей. Цели этого поста в блоге — показать, как Xtend может улучшить способ создания пользовательского интерфейса. Я нашел хорошие примеры для JavaFX, GWT… но я ничего не нашел для Vaadin, поэтому я решил создать простой класс для сборки Ваадин Ю.И. Или, если быть более точным, просто его часть. Следующий пример не полностью реализован и может создавать только некоторую часть пользовательского интерфейса, но его можно легко расширить.
Пользовательский интерфейс Vaadins является примером императивного пользовательского интерфейса, написанного на Java. Процесс создания пользовательского интерфейса похож на создание императивного пользовательского интерфейса в GWT или SWT. Вот простой пример того, как это выглядит:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
package org.pis.web.application; import org.eclipse.xtext.xbase.lib.InputOutput; import com.vaadin.Application; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Panel; import com.vaadin.ui.Window; @SuppressWarnings ( "serial" ) public class MainWindow extends Application { public void init() { Window main = new Window(); HorizontalLayout hl = new HorizontalLayout(); Panel panel = new Panel(); final Button button = new Button( "First button" ); button.addListener( new ClickListener() { @Override public void buttonClick(ClickEvent event) { sayHello( "Hello First Button" ); button.setCaption( "First button clicked" ); } }); panel.addComponent(button); Button button2 = new Button( "Second button" ); button2.addListener( new ClickListener() { @Override public void buttonClick(ClickEvent event) { sayHello( "Hello Second Button" ); } }); main.addComponent(hl); setMainWindow(main); } public void sayHello( final String string) { InputOutput.<String> println(string); } } |
Приведенный выше пример является типичной реализацией пользовательского интерфейса Vaadin, и моя цель — сделать его проще и удобочитаемее. Для этого я начну с класса строителей.
Создание UI Builder API
Чтобы получить лучший способ создания пользовательского интерфейса, я сначала создам компонентный компоновщик. Это не стандартная реализация шаблона компоновщика, как мы можем сделать в чистой Java. На самом деле мы строим расширение класса. Этот класс содержит методы расширения, которые расширят существующий класс новыми методами. А вот и реализация класса.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
package org.pis.web.application import com.vaadin.ui.Window import com.vaadin.ui.Button import com.vaadin.ui.Panel import com.vaadin.ui.HorizontalLayout import com.vaadin.ui.ComponentContainer class ComponentBuilder{ def window ( (Window) => void initializer){ new Window().init(initializer) } def panel( ComponentContainer it, (Panel) => void initializer){ val panel = new Panel().init(initializer) it.addComponent(panel) return panel } def horizontalLayout (ComponentContainer it, (HorizontalLayout) => void initializer){ val hl = new HorizontalLayout().init(initializer) it.addComponent(hl); return hl } def button ( ComponentContainer it, (Button)=> void initializer){ println( 'Button in panel creation' ) val that = new Button().init(initializer); it.addComponent(that); return that } def private <T> T init(T obj, (T) => void init){ init?.apply(obj) return obj } } |
Один только класс конструктора не может сделать так много, он имеет базовую функциональность, такую как окно создания, добавление различных видов панелей и кнопок, и если вы знакомы с Vaadin, вы знаете, что в каркасе встроено намного больше компонентов. Почти все методы в конструкторе имеют два параметра. Первый параметр представляет класс контейнера, который будет обрабатывать новый компонент, а второй параметр — замыкание, которое будет содержать код для инициализации компонента.
Создание интерфейса
Код, приведенный в следующем фрагменте, является иллюстрацией использования класса builder для создания пользовательского интерфейса Vaadin. Первая строка в теле класса включает ComponentBuilder в качестве расширения. А мощный лямбда-синтаксис Xtend позволяет сделать код более простым и понятным. Таким образом мы исключили внутренний класс Java и много стандартного кода, который мы имели бы в случае чистой Java. Подробнее о лямбда-выражениях Xtend можно найти в документации Xtend
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package org.pis.web.application import com.vaadin.Application import com.vaadin.ui.Button class MainWindowXtend extends Application{ extension ComponentBuilder = new ComponentBuilder override init() { mainWindow = window[ horizontalLayout[ panel[ button[ caption = "First button" it.addListener()[ sayHello( 'Hello First Button' ); component as Button component.caption = 'First button clicked' ] ] button[ caption = "Second button" it.addListener()[ sayHello( 'Hello' ); ] ] ] ] ]; } def void sayHello(String string) { println(string) } } |
Вывод
Так что это действительно хороший язык, процесс обучения занимает всего несколько часов. Документация хорошо написана, основная языковая концепция показана примерно на 50 страницах. Через несколько часов вы готовы к улучшению вашего приложения. Вот как должна выглядеть Java. Короче говоря, играть с Xtend было весело и стоит потратить время.
Ссылка: Создание пользовательского интерфейса Vaadin с Xtend от нашего партнера по JCG Игоря Маджерича в блоге Игоря Маджерика .