今天,我決定向Xtend打個招呼。 我希望學習一些新的編程語言。 選擇一個標準的清單并不多。
- 它必須是在JVM上運行的編程語言,
- 如果我不需要學習用于建筑應用的全新生態系統,那就太好了。
我已經檢查了幾個選項。 JVM的編程語言列表已不多了,但在我決定要選擇以下語言時:Groovy,Scala和Xtend。 在和我已經選擇Xtend。
Scala不能很好地適合我的標準,另一方面,符合我的條件的常規方法卻是Xtend之后我將學習的下一門編程語言。 很難解釋為什么我選擇Xtend。 我什至不認為Xtend是一種編程語言,它更像是擴展,但這是我的看法。
什么是Xtend
因此,這里有一些關于該語言的詞。 有關更多信息,請訪問Xtend網頁。 這是一種美觀而簡單的語言,可以使Java現代化。 Xtend代替了編譯后的字節碼,而是轉換為漂亮的Java類,這使其適用于無法使用字節碼(例如GWT)的平臺。 正如我已經提到的,用Xtend編寫的代碼產生Java類,因此在使用任何現有Java框架時都沒有限制。 該語言是用Xtext創建的,因此它已經準備好了Eclipse,并且有該語言的maven插件,因此在Eclipse中使用它不會有問題。
學習
學習Xtend并不難。 Java中目前缺少一些語法更改和一些新的語義概念。 與其他編程語言相比,沒有什么革命性的東西,Xtend只是用新功能擴展了Java,它將使您可以創建更好,更短的類。 我最關注的功能是閉包,lambda表達式和擴展。 這些東西使您可以創建一個非常好的構建器類。 您可以輕松創建UI Builders API,這將使您可以創建更簡單的視圖(不是在功能范圍內,而是在代碼理解的范圍內)。
參與Xtend
我已經提到Xtend是使用Xtext構建的,這意味著eclipse已經能夠正確處理Xtend語言。 創建新的Xtend類后,如果您不使用maven獲取依賴項,則eclipse將抱怨缺少的lib,并提供您將其添加到類路徑中。 這篇博客文章的目的是展示Xtend如何改善構建UI的方式。我已經找到了JavaFX,GWT的好示例……但是我沒有找到Vaadin的任何東西,因此我決定構建一個簡單的類來構建Vaadin UI。 或者更確切地說只是其中的一部分。 下面的示例尚未完全實現,它只能構建UI的一部分,但可以輕松擴展。
Vaadins UI是用Java編寫的命令式UI的示例。 構建UI的過程類似于GWT或SWT中構建命令式UI的過程。 這是一個簡單的示例,其外觀如下:
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() {@Overridepublic 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() {@Overridepublic 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的典型實現,我的目標是使其變得更容易閱讀。 為此,我將從構建器類開始。
制作UI Builder API
為了更好地創建UI,我將首先創建一個組件構建器。 這不是構建器模式的標準實現,就像我們可以在純Java中那樣。 實際上,我們正在構建擴展類。 此類包含擴展方法,這些擴展方法將使用新方法擴展現有的類。 這是該類的實現。
package org.pis.web.applicationimport com.vaadin.ui.Window
import com.vaadin.ui.Button
import com.vaadin.ui.Panel
import com.vaadin.ui.HorizontalLayout
import com.vaadin.ui.ComponentContainerclass 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 }}
單獨的builder類不能做很多事情,它具有基本的功能,例如構建窗口,添加各種面板和按鈕,并且如果您熟悉Vaadin的話,您知道框架中內置了很多組件。 構建器中的幾乎所有方法都有兩個參數。 第一個參數代表將處理新組件的容器類,第二個參數是閉包,它將包含用于組件初始化的代碼。
制作UI
以下代碼段中的代碼說明了如何使用構建器類來構建Vaadin UI。 類主體中的第一行包括ComponentBuilder作為擴展。 強大的Xtend的lambda語法使代碼看起來更簡單易懂。 這樣,我們消除了Java的內部類和許多純Java代碼中的樣板代碼。 有關Xtend Lambda表達式的更多信息,請參見Xtend的文檔。
package org.pis.web.applicationimport com.vaadin.Application
import com.vaadin.ui.Buttonclass MainWindowXtend extends Application{extension ComponentBuilder = new ComponentBuilderoverride init() { mainWindow = window[horizontalLayout[panel[button[caption = "First button"it.addListener()[sayHello('Hello First Button');component as Buttoncomponent.caption = 'First button clicked']]button[caption = "Second button"it.addListener()[sayHello('Hello');]]]]]; }def void sayHello(String string) { println(string)}}
結論
因此,這是一種非常不錯的語言,學習過程僅需幾個小時。 文檔寫得很好,主要的語言概念顯示在大約50頁中。 幾個小時后,您就可以準備改善您的應用程序了。 這就是Java的外觀。 簡而言之,與Xtend一起玩很有趣,值得花時間。
參考: Igor Madjeric博客上的JCG合作伙伴 Igor Madjeric 使用Xtend構建Vaadin UI 。
翻譯自: https://www.javacodegeeks.com/2013/02/building-vaadin-ui-with-xtend.html