2010-02-07 19 views
11

Java關閉規範的當前狀態是什麼?Java關閉類型,變量,數組和集合

  1. 在建議的Java規範封閉,我們將能夠 創建倒閉的數組或集合?
    如果是這樣,這個語法是可能的嗎?

    {int x, int y => boolean b}[] comparisonSwitch = { 
        {int i, int j => return i>j}, 
        {int i, int j => return j<i}, 
        {int i, int j => return j==i} 
    } 
    
    boolean compare(int acase, int a, int b){ 
        return comparisonSwitch[acase].invoke(a,b); 
    } 
    
  2. 將正常方法視爲非匿名閉包嗎?
    那麼下面的語法是可能的嗎?

    public class Asdf 
    { 
        public boolean gt(int x, int y){ 
        return x>y; 
        } 
        public boolean lt(int x, int y){ 
        return x<y; 
        } 
        public boolean eq(int x, int y){ 
        return x==y; 
        } 
    
        {int x, int y => boolean b} GT = gt; 
        {int x, int y => boolean b}[] comparisonSwitch = { 
        gt, lt, eq 
        } 
    } 
    
  3. 即,封閉和方法是可操作地互換嗎?
    會允許以下語法嗎?

    // declare a method that has a closure type as an argument 
    void closurator({String s => int a} findlen){ 
        // do whatever 
    } 
    String s = "hello"; 
    void useClosurator(){ 
        // invoke the method by supplying a non-anonymous method 
        // of an object 
        closurator(s.indexOf(String ss)); 
    } 
    
  4. 我們將如何能夠在界面中指定閉包類型?
    我們能否做到以下幾點,有效地聲明方法的最終/常量引用。

    interface Closuration 
    { 
        public class Asdf 
        { 
        static public boolean gt(int x, int y){ 
         return x>y; 
        } 
        static public boolean lt(int x, int y){ 
         return x<y; 
        } 
        static public boolean eq(int x, int y){ 
         return x==y; 
        } 
        } 
    
        {int x, int y => boolean b}[] comparisonSwitch = { 
        Asdf.gt, Asdf.lt, Asdf.eq 
        }; 
    } 
    
  5. 由於關閉將訪問代碼空間,就像反射會,會用封閉減慢程序的性能?如果不是,是否意味着通過借用「封閉技術」所取得的進展來加速反思?

插入了新的問題: 事實上,將關閉代碼是代碼空間或可變堆的一部分,因爲我預測,封閉代碼都可能會受到垃圾收集被擦去,對不對?

我可以請求您關注問題的要點,而不是示例代碼中的任何語法錯誤/拼寫錯誤/缺少關鍵字。任何錯誤/錯誤,請糾正它們給我。謝謝。

+0

如果你們中的任何一位有點太急於將此問題作爲「不是真正的問題」來解決,請閱讀我的自我評論http://stackoverflow.com/questions/2198734/demonstrate-prove-that -heap-sort-is-on-log2n-time-closed:這不是作業。 50歲的古老程序員需要一些誠實的幫助來做出一些戰略決策。 – 2010-02-07 07:53:06

+0

這個關於Neal Gafter的封閉提案的問題,還是目前正在討論的lambda? – 2010-02-07 12:03:53

+0

正在編寫當前的Project Lambda:Java語言規範草案0.1 http://mail.openjdk.java.net/pipermail/lambda-dev/attachments/20100122/3764c21a/attachment.txt 0.2版。 – 2010-02-07 12:08:34

回答

12

你在問關於JDK7關閉的工作,所以引用javac.info是不相關的。該網站是關於現在完成的openjdk關閉項目,它顯示瞭如何添加透明封閉到Java - 透明性在滿足Tennent的對應原則和大致在my blog描述的意義。

JKD7的努力組織在openjdk lambda project之下。規範正在迅速發展,所以任何答案都是暫時的。正如湯姆霍金指出的那樣,here is the latest draft spec

在回答您的具體問題之前,值得注意的是Java具有用於變量和方法的單獨命名空間。因此,調用一個方法和調用一個函數類型的變量(用C#的說法,一個委託)可能會有一些語法區別。同樣,你不可能只用一個方法來引用一個方法,就像你會引用一個字段一樣。

回答您的問題:

  1. 這不是一個函數類型的建議語法。把這個問題放在一邊,你想知道如果有一個函數類型的數組是合法的。目前的草案規範建議答案是肯定的,但已知的實現策略會導致類型系統中出現漏洞,除非「函數類型數組」被禁止。規範草案小心避免討論實施策略。有可能VM規格的變化可以解決這些問題。如果我不得不猜測,我懷疑你的問題的答案是「否」。但是,您可以使用java.util.List而不是陣列來達到相同的效果。考慮到單獨的project Coin正在考慮爲List添加Collection文字和索引操作,它很可能在語法上很方便。
  2. 你想知道你是否會通過命名一個方法來創建一個函數值表達式。由於(除其他原因外)方法和變量出現在Java中的不同名稱空間中,答案可能不是。但是,規範可能會以特定的語法進行擴展,以便將方法名稱視爲函數值表達式。使用Stephen Colebourne提出的語法,參見方法參考文獻,文檔Closures for Java (v0.6a)用於可能考慮的一種方式。目前還沒有任何項目lambda的草案。
  3. 查看(2)的答案。
  4. 查看(2)的答案。
  5. 您關注性能。簡而言之,關閉將不可能用任何技術來實現,這些技術會導致它們比一種方法更昂貴。由於性能原因,不需要更改虛擬機,儘管由於其他原因它們可能是個好主意(請參閱答案1)。請參閱the Closures Project homepage以獲得BGGA原型的指針,這是一個更具雄心的閉包規範,可以在jdk5/jdk6庫上運行,並且可以測量其性能。
1

JDK7中的封裝目前在細節上很短。在Devoxx的演示中,使用的示例與FCM closures proposal非常相似。

假設規範在JDK7中使用,那麼我認爲你的問題的第2,3和4部分的答案是肯定的(儘管我很可能是錯的)。

對於第1部分 - 我認爲應該可以擁有數組,因爲方法文字可以分配給方法對象。

對於第5部分,我會懷疑表現會類似於內部類。

對不起,我有點模糊 - 我希望它有一點幫助。可以確定地回答你的問題可能還爲時尚早。

+0

語法類似於FCM(它使用散列字符)。實際提案非常不同。 – 2010-02-07 12:02:54