2013-11-22 51 views
3

是的我知道,它們在名稱旁邊沒有任何共同之處:-)今天我在JavaFX webengine服務器環境中使用d3。這個效果很好,但我對性能和將對象轉換爲JSObject並返回並不滿意。長話短說,我正考慮移植d3以用於Java。翻譯JavaScript(d3)到Java

由於JavaScript使用lambda和clojures我不確定我是否應該使用「中間件」 - 即將JavaScript翻譯爲Scala並在我現有的Java應用程序中使用Scale類。而且由於我不是Java 8,Scala,Clojure和Groovy,所以我想讓你問問這是否會讓端口變得更簡單。哪一個將是最好的選擇 - 就類似的語法特徵而言。

您認爲d3這樣的項目會付出怎樣的努力?我期待5天左右。

回答

1

儘管Groovy的選項是statically compiled,但默認情況下采用熟悉的括號語法是動態的。在這三者中,我相信Groovy與Javascript最爲相似。 Groovy的元編程類似於Javascript的原型,而Groovy具有lambda/closures。

我沒有使用Javascript大師,但是這個JS代碼:之前

class Person { 
    String name 
} 

Person.metaClass.upperName = { 
    delegate.name.toUpperCase() 
} 

def person = new Person(name: "john doe") 

println person.upperName() // prints JOHN DOE 
+0

我會接受這是正確的答案,因爲這符合最好的問題。但我會給c2一個嘗試,所以我贊成這一個。 – KIC

0

如果你想在JVM上使用javascript:Rhino

Javascript是動態類型的(有點弱類型)。 Clojure在這方面隱約相似,概念相當類似,但語法,控制結構和庫API不同,因此會涉及一些工作。

由於它們是靜態類型強類型語言,因此轉換爲Scala/Java 8可能需要更長的時間(如果您有複雜的邏輯&數據結構)。儘管java確實具有與JS相似的語言語法的優點。

+0

謝謝,我已經試過犀牛:

function Person(personName) { var name = personName; this.getName = function() { return name; } } Person.prototype.upperName = function() { return this.getName().toUpperCase(); } var person = new Person("john doe"); console.log(person.upperName()); // prints JOHN DOE 

可以用元編程寫在Groovy中,通過metaClass,並關閉我開始使用JavaFX,但沒有成功。 – KIC

1

所有我的建議是從Clojure的角度使用,據我知道你可以使用:

  • C2,「Clojure中(腳本)的聲明數據可視化」(它有一個類似的功能D3但用Clojure Thinking完成)。
  • Quil, 「混合processing.org和Clojure的」
  • Strokes: 「讓我們假設D3寫於ClojureScript」

注:ClojureScript是針對JavaScript的Clojure的,所以我認爲C2和奎爾是更好的選擇雖然Strokes更類似於用clojure編寫的D3

+1

非常感謝C2的提示,這真的看起來很有希望! – KIC

+0

很高興聽到這一點,我也喜歡C2,但我記得C2並不是用來支持動畫D3 – tangrammer

+0

我會接受groovy作爲正確答案,因爲這符合最好的問題。但我會給c2一個嘗試,所以我贊成這一個。 – KIC

1

您是否嘗試過使用Java 8/Nashorn?據說比基於Rhino的實施要快幾倍。

山姆Pullara,從Twitter,走上前來形容它 如何無痛人流是讓Mustache.js啓動和運行(20倍以上犀牛),和約翰· 切卡雷利,從NetBeans中出面來描述如何Nashorn已將 成爲Netbeans的組成部分。 [Nashorn Blog]

+0

可悲的Rhino/Nashorn缺少dom實現,所以你必須使用類似env.js這很不合時宜的東西。或重新整理整個事物並共享Java對象。這是我以前做過的,但並不是很酷且很難調試。 – KIC

+0

@KIC對於Rhino和Nashorn,您在JavaFX 2中都有WebKit('WebView'),因此您不需要模擬瀏覽器。實際上,我正在編寫一個AngularJS桌面應用程序,該應用程序在「WebView」中運行。從Java調用JS的簡單演示(反之亦然,在某些情況下,您需要將對象序列化爲JSON,因爲它現在在Java 8中是錯誤的):[demo](https://gist.github.com/chaschev/7481304)。 –

+0

請看我的問題,這正是我今天所做的。 – KIC