日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Groovy如何幫助JavaFX:別了,純粹的Java代碼?

在眾多為試用者所熟知的JavaFX酷例應(yīng)用當(dāng)中,JavaFX天氣應(yīng)用程序是其中之一,現(xiàn)在它已經(jīng)捆綁進(jìn)NetBeans IDE 6.5.1/JavaFX 1.2 綁定包了。簡(jiǎn)而言之,它連接到一個(gè)氣象服務(wù)那里,然后利用一個(gè)令人印象深刻的JavaFX GUI選定城市的天氣結(jié)果:

創(chuàng)新互聯(lián)是一家專業(yè)提供榆陽(yáng)企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、html5、小程序制作等業(yè)務(wù)。10年已為榆陽(yáng)眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

在周三JavaOne上(有關(guān)JavaOne 2009,可參考之前的JavaOne 2009全線報(bào)導(dǎo))舉行的一個(gè)主題為“JavaFX編程語(yǔ)言+Groovy=美+生產(chǎn)力”的技術(shù)研討會(huì)上,Dierk K?nig 展示了若干強(qiáng)大的Groovy與 JavaFX互動(dòng)的方式。以下是其中一種方式的概要,含全部代碼及結(jié)果。這真的令人印象深刻,并讓Dierk在會(huì)上演示時(shí)贏得了來(lái)自聽(tīng)眾的一輪掌聲。

JavaFX天氣應(yīng)用使用這個(gè)海量Java類創(chuàng)建了如上的GUI,用以連接到Y(jié)ahoo的氣象服務(wù)。Java類連接到的完整的RSS種子如下所示:

 
 
 
 
  1.     
  2.         Yahoo! Weather - Prague, EZ
  3.         http://us.rd.yahoo.com/dailynews/rss/weather/Prague__EZ/*http://weather.yahoo.com/forecast/EZXX0012_f.html
  4.         Yahoo! Weather for Prague, EZ
  5.         en-us
  6.         Fri, 05 Jun 2009 8:00 pm CEST
  7.         60
  8.         
  9.         
  10.         
  11.         
  12.         
  13.         
  14.             Yahoo! Weather
  15.             142
  16.             18
  17.             http://weather.yahoo.com
  18.             http://l.yimg.com/a/i/us/nws/th/main_142b.gif
  19.         
  20.         
  21.             Conditions for Prague, EZ at 8:00 pm CEST
  22.             50.1
  23.             14.28
  24.             http://us.rd.yahoo.com/dailynews/rss/weather/Prague__EZ/*http://weather.yahoo.com/forecast/EZXX0012_f.html
  25.             Fri, 05 Jun 2009 8:00 pm CEST
  26.             
  27.             
  28. Current Conditions:
  29. Partly Cloudy, 54 F
  30. Forecast:
  31. Fri - Partly Cloudy. High: 58 Low: 42
  32. Sat - PM Rain. High: 58 Low: 49
  33. Full Forecast at Yahoo! Weather(provided by The Weather Channel)
  34. ]]>
  35.             
  36.             
  37.             
  38.             EZXX0012_2009_06_05_20_00_CEST
  39.         
  40.     

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

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

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

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

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

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

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

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

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

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

“JavaFX不是Java!這批文章應(yīng)該發(fā)表在Groovy區(qū),它不應(yīng)該出現(xiàn)在Java區(qū),因?yàn)樗鶭ava毫不相關(guān)?!?/p>

不過(guò),更多的討論是圍繞著Java平臺(tái)語(yǔ)言未來(lái)的走向,以及做為程序員的選擇而進(jìn)行的。以下,編輯節(jié)選了部分精彩的討論內(nèi)容:

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

——————

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

——————

對(duì)于大部分應(yīng)用而言,Groovy表現(xiàn)已足夠好(就像Ruby和PHP一樣),Groovy代碼不夠快的時(shí)候,你可以寫(xiě)Java代碼。此二者的集成是無(wú)縫的。同樣,如果你不喜歡動(dòng)態(tài)類型,那就使用靜態(tài)類型吧。沒(méi)人阻止你在Groovy里用靜態(tài)類型。這正是它很棒的地方之一。如果你擔(dān)心bug的困擾,因?yàn)樽约菏褂昧藙?dòng)態(tài)語(yǔ)言,我建議你進(jìn)行單元測(cè)試,并使用一個(gè)好的持久的集成服務(wù)器。

——————

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

之所以會(huì)這么說(shuō),是因?yàn)镴avaFX是Sun(Oracle)提供的新基石,這是需要的,也不錯(cuò)。JavaFX可與Flash/Flex/AIR競(jìng)爭(zhēng),Groovy則有自己的位置,但是許多人(包括我在內(nèi))認(rèn)為腳本語(yǔ)言管理復(fù)雜應(yīng)用是有問(wèn)題的,因?yàn)槿鄙倬幾g器(是的我知道你可以編譯Groovy)。給“非純粹Java代碼”唱頌歌可以理解,盡管這會(huì)促使就使用正確技術(shù)作出壞的決定。

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

我已經(jīng)一遍又一遍地讀過(guò)這樣的例子:

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

“這簡(jiǎn)直就是酷斃了,尤其是再把它跟原來(lái)的丑陋代碼比對(duì)過(guò)之后?!?/p>

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


文章標(biāo)題:Groovy如何幫助JavaFX:別了,純粹的Java代碼?
文章分享:http://www.5511xx.com/article/dhocdds.html