自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Groovy如何幫助JavaFX:別了,純粹的Java代碼?

譯文
開發(fā) 開發(fā)工具
今年的JavaOne大會上,JavaFX再次露了一把臉,而同時活躍在大會上的還有Groovy,Scala等圍繞著Java平臺的語言。大會中的一個展示應用是由JavaFX和Groovy合作完成的,本文作者在觀展之后寫下了這篇文章,認為純粹的Java代碼時代即將終結。雖然作者對于JavaFX與Java的差別似乎有些理解上的偏差,但這并不妨礙開發(fā)者們對于這篇文章的關注,以及對Java平臺上語言的發(fā)展趨勢之展望。

【51CTO快譯】在眾多為試用者所熟知的JavaFX酷例應用當中,JavaFX天氣應用程序是其中之一,現(xiàn)在它已經捆綁進NetBeans IDE 6.5.1/JavaFX 1.2 綁定包了。簡而言之,它連接到一個氣象服務那里,然后利用一個令人印象深刻的JavaFX GUI選定城市的天氣結果:

JavaFX天氣應用

在周三JavaOne上(有關JavaOne 2009,可參考51CTO之前的JavaOne 2009全線報導)舉行的一個主題為“JavaFX編程語言+Groovy=美+生產力”的技術研討會上,Dierk König 展示了若干強大的Groovy與 JavaFX互動的方式。以下是其中一種方式的概要,含全部代碼及結果。這真的令人印象深刻,并讓Dierk在會上演示時贏得了來自聽眾的一輪掌聲。

JavaFX天氣應用使用這個海量Java類創(chuàng)建了如上的GUI,用以連接到Yahoo的氣象服務。Java類連接到的完整的RSS種子如下所示:

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
  2. <rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"> 
  3.  
  4.     <channel> 
  5.  
  6.         <title>Yahoo! Weather - Prague, EZ</title> 
  7.         <link>http://us.rd.yahoo.com/dailynews/rss/weather/Prague__EZ/*http://weather.yahoo.com/forecast/EZXX0012_f.html</link> 
  8.         <description>Yahoo! Weather for Prague, EZ</description> 
  9.         <language>en-us</language> 
  10.         <lastBuildDate>Fri, 05 Jun 2009 8:00 pm CEST</lastBuildDate> 
  11.         <ttl>60</ttl> 
  12.  
  13.         <yweather:location city="Prague" region=""   country="EZ"/> 
  14.         <yweather:units temperature="F" distance="mi" pressure="in" speed="mph"/> 
  15.         <yweather:wind chill="54"   direction="60"   speed="3" /> 
  16.         <yweather:atmosphere humidity="58"  visibility="6.21"  pressure="29.8"  rising="0" /> 
  17.         <yweather:astronomy sunrise="4:56 am"   sunset="9:06 pm"/> 
  18.  
  19.         <image> 
  20.             <title>Yahoo! Weather</title> 
  21.             <width>142</width> 
  22.             <height>18</height> 
  23.             <link>http://weather.yahoo.com</link> 
  24.             <url>http://l.yimg.com/a/i/us/nws/th/main_142b.gif</url> 
  25.         </image> 
  26.  
  27.         <item> 
  28.  
  29.             <title>Conditions for Prague, EZ at 8:00 pm CEST</title> 
  30.             <geo:lat>50.1</geo:lat> 
  31.             <geo:long>14.28</geo:long> 
  32.             <link>http://us.rd.yahoo.com/dailynews/rss/weather/Prague__EZ/*http://weather.yahoo.com/forecast/EZXX0012_f.html</link> 
  33.             <pubDate>Fri, 05 Jun 2009 8:00 pm CEST</pubDate> 
  34.             <yweather:condition  text="Partly Cloudy"  code="30"  temp="54"  date="Fri, 05 Jun 2009 8:00 pm CEST" /> 
  35.             <description><![CDATA[  
  36. <img src="http://l.yimg.com/a/i/us/we/52/30.gif"/>  
  37. <b>Current Conditions:</b>  
  38. Partly Cloudy, 54 F  
  39. <b>Forecast:</b>  
  40. Fri - Partly Cloudy. High: 58 Low: 42  
  41. Sat - PM Rain. High: 58 Low: 49  
  42. <a >Full Forecast at Yahoo! Weather</a>(provided by The Weather Channel)  
  43.  
  44. ]]> 
  45.             </description> 
  46.             <yweather:forecast day="Fri" date="5 Jun 2009" low="42" high="58" text="Partly Cloudy" code="29" /> 
  47.             <yweather:forecast day="Sat" date="6 Jun 2009" low="49" high="58" text="PM Rain" code="12" /> 
  48.             <guid isPermaLink="false">EZXX0012_2009_06_05_20_00_CEST</guid> 
  49.  
  50.         </item> 
  51.  
  52.     </channel> 
  53.  
  54. </rss> 

現(xiàn)在,不管你有沒有聽說過“Groovy”,你都要考慮一下“老土的工作”(譯注:grunt work,Groovy的諧音)。這正是Groovy尤其擅長的地方。一個相關的有力案例是web服務。還有,其HTML和XML的解析。因此,一旦你需要在Java應用中與web服務交互,最應該考慮的助手顯然就是Groovy了。
看一下上面的RSS然后看看下面Groovy代碼的11行,以下是相關代碼:

  1. def channel = new XmlParser().parse(url).channel 

這一行給了你上面的RSS種子的“channel”元素!了不起,是不是?而從那兒開始,下面的Groovy腳本對RSS種子進行解析,確切地識別出那些JavaFX GUI感興趣的部分,然后用了大約20行,產生出的結果,跟通常約需250行才能做出來的一模一樣。

看看下面的Groovy代碼段,跟上面的RSS種子對比一下,來了解它是如何工作的。注意,這甚至還不是代碼段!這就是Groovy web service類的全部了。這簡直就是酷斃了,尤其是再把它跟原來的丑陋代碼比對過之后。

  1. package weatherfx.service  
  2.  
  3. class YahooWeatherServiceG {  
  4.     static YW = new groovy.xml.Namespace("http://xml.weather.yahoo.com/ns/rss/1.0")  
  5.  
  6.     def forecasts  
  7.       
  8.     YahooWeatherServiceG(String code, boolean celsius) {  
  9.         def url = "http://weather.yahooapis.com/forecastrss?u=f&p=$code" 
  10.         println url.toURL().text  
  11.         def channel = new XmlParser().parse(url).channel  
  12.         cityName = channel[YW.location].@city 
  13.         def wind = channel[YW.wind].first()  
  14.         windSpeed = wind.@speed.toInteger()  
  15.         windDirection = wind.@direction.toInteger()  
  16.         def cond = channel.item[YW.condition].first()  
  17.         temp = cond.@temp.toInteger()  
  18.         forecasts = channel.item[YW.forecast]  
  19.     }  
  20.  
  21.     String cityName   
  22.     int temp  
  23.     int windSpeed  
  24.     int windDirection  
  25.  
  26.     int getConditionCode(int day=0) { forecasts[day].@code.toInteger() }  
  27.     int getLowsTemp     (int day=0) { forecasts[day].@low.toInteger()  }  
  28.     int getHighsTemp    (int day=0) { forecasts[day].@high.toInteger() }  
  29. }  

現(xiàn)在,停下來想象一下,上述代碼跟其原始純粹的Java代碼相比起來,(a)測試和(b)維護是不是要簡單、高效得多,且不易出錯?

不過,目前還沒有一個JavaFX/Groovy的交叉編譯器。因此,怎樣去把你的Java web service代碼替換為上面的Groovy代碼呢?首先創(chuàng)建一個獨立的工程來建立你的Groovy web service。然后,將該工程添加進你的JavaFX應用的classpath。接著,將你的JavaFX應用中的兩三個指向原始Java類的引用替換為指向Groovy class (經編譯后現(xiàn)在已是Java類) 。

上述這一段做完之后如下圖所示:

改寫結果 

然后運行JavaFX應用,你將得到跟先前一樣的結果,不同的是web service代碼現(xiàn)在是由Groovy處理了。還有,就是你的應用中再也沒有純粹的Java代碼了。哦,親愛的。JavaFX創(chuàng)建了GUI,而Groovy則在后臺干些臟累活(grunt work)。那么,該對純粹的Java代碼說聲再見了?

編者注:首先應該說明一下,雖然JavaFX與Java之間可互操作,JavaFX在語法上也從Java中繼承了很多,但是腳本語言JavaFX和Java并不是同一個概念。不過這篇文章自發(fā)布在JavaLobby上之后,得到了很多國外程序員的關注。當然,其中有人指出了作者犯的這個概念性錯誤:

“JavaFX不是Java!這批文章應該發(fā)表在Groovy區(qū),它不應該出現(xiàn)在Java區(qū),因為它跟Java毫不相關?!?/FONT>

不過,更多的討論是圍繞著Java平臺語言未來的走向,以及做為程序員的選擇而進行的。以下,51CTO編輯節(jié)選了部分精彩的討論內容:

我喜歡groovy,但我們還是需要Java的。Groovy的性能以及內存消耗跟Java相比起來是可笑的。相比使用Groovy來取代Java(原文是replace better Java,即取代更好的Java),我更愿意選擇Scala:它支持帶靜態(tài)類型的函數式編程,同時得益于類型推導,擁有許多優(yōu)點。

——————

我認為性能不是問題,在動態(tài)語言方面VM(虛擬機)正變得越來越“聰明”。我有時使用groovy,“真的”很喜歡它,不過就是不習慣用動態(tài)類型。用它我省下的時間都被BUG吹飛了,除非編譯器能捕獲到它。這就是為什么我的第二選項是Scala,只要它有了更多的工具和供應商支持。

——————

對于大部分應用而言,Groovy表現(xiàn)已足夠好(就像Ruby和PHP一樣),Groovy代碼不夠快的時候,你可以寫Java代碼。此二者的集成是無縫的。同樣,如果你不喜歡動態(tài)類型,那就使用靜態(tài)類型吧。沒人阻止你在Groovy里用靜態(tài)類型。這正是它很棒的地方之一。如果你擔心bug的困擾,因為自己使用了動態(tài)語言,我建議你進行單元測試,并使用一個好的持久的集成服務器。

——————

Groovy是“作為平臺的Java”之上的一個更高級的語言,JavaFX甚至還要高些。Groovy、JavaFX和Java作為語言是“作為平臺的Java”的不同的味道。在JavaLobby里面出現(xiàn)Groovy和JavaFX的新聞是有意義的。一旦某一天Groovy和JavaFX取得了壓倒性的勝利,就有必要建立一個javafx區(qū)和Groovy區(qū)來避免每天出現(xiàn)過多的相關新聞,而java.dzone.com就將成為一個專門有關Java“語言”的社區(qū)。

之所以會這么說,是因為JavaFX是Sun(Oracle)提供的新基石,這是需要的,也不錯。JavaFX可與Flash/Flex/AIR競爭,Groovy則有自己的位置,但是許多人(包括我在內)認為腳本語言管理復雜應用是有問題的,因為缺少編譯器(是的我知道你可以編譯Groovy)。給“非純粹Java代碼”唱頌歌可以理解,盡管這會促使就使用正確技術作出壞的決定。

腳本有用武之地,真的,在小規(guī)模應用(或者重復同樣模式的應用)以及需要從外部讀取源碼的高度動態(tài)的應用。

我已經一遍又一遍地讀過這樣的例子:

def channel = new XmlParser().parse(url).channel 

“這簡直就是酷斃了,尤其是再把它跟原來的丑陋代碼比對過之后。”

我得說,那不是語言,而是API:原始的Java代碼使用了SAX解析器,SAX解析器是個標記用的底層API,使用DOM的話會短一些(我確信Groovy在后臺使用了DOM),Document.getDocumentElement()方法返回了channel節(jié)點。使用XPath及/或 TreeWalker能幫助以你在Groovy中以類似的方式跨越DOM。Java代碼的確有點冗長,不過誰會在意呢?還有,如果你把某些典型的DOM代碼打包進自建的客戶化迷你API里面,你就會有跟Groovy一樣的生產力。有一個問題,就是你得編譯Java代碼,但用Groovy和JavaFX就不用。是的,毫無疑問,如果編譯階段是個問題的話,Groovy和JavaFX就很美妙了。

【編輯推薦】

  1. JavaFX對Java開發(fā)者到底意味著什么
  2. JavaFX應用問題解答
  3. 基于JVM的語言正在開始流行
  4. 專題:Groovy開發(fā)技術
  5. 專題:Scala編程語言
責任編輯:yangsai 來源: 51CTO.com
相關推薦

2018-11-08 12:14:51

蘋果庫克iPhone

2019-11-27 09:07:42

Java模型項目

2009-06-23 14:44:29

調用JavaFX

2013-04-17 10:20:27

GroovyClassLoader

2022-09-30 00:00:00

云計算自動化IT

2018-10-18 12:42:24

2015-11-10 12:32:58

編程快樂程序員

2009-07-14 16:07:59

調用JavaFX代碼Swing程序

2023-03-06 00:24:05

Kubernetes項目開源

2022-09-06 09:37:17

GroovyJava框架

2009-06-16 15:17:38

JavaFX

2012-11-30 13:29:15

2025-04-16 09:35:03

2009-05-07 09:06:58

C++BuilderBorland

2018-03-05 08:59:21

Java 開源Oracle

2010-08-25 10:42:20

GroovyGroovy++

2009-09-03 11:47:43

Groovy與Java

2019-12-03 09:20:50

區(qū)塊鏈貨幣自動化

2009-07-08 11:44:40

ScalaGroovyJVM

2023-09-05 15:26:52

CTO程序員
點贊
收藏

51CTO技術棧公眾號