2017-06-20 86 views
15

This question現在已經超過3年,專門針對Java 8,接受的答案也引用了Java SE 8 Final Specification是否有可能在Java 9中註釋lambda表達式?

如果關於這個問題的某些事情會在Java 9中發生變化,我會感興趣的:有什麼辦法來註釋類似於註釋相應的匿名類的lambda表達式嗎?


實施例:

譯註:

Consumer<String> consumer = new @MyTypeAnnotation("Hello ") Consumer<String>() { 
    @Override 
    public void accept(String str) { 
     System.out.println(str); 
    } 
}; 

註解一個蘭巴表達,目前沒有在Java中5-8:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE_USE) 
public @interface MyTypeAnnotation { 
    public String value(); 
} 

工作匿名類的註釋

Consumer<String> myAnnotatedConsumer = @MyTypeAnnotation("Hello") (p -> System.out.println(p)); 
+0

這兩個構造之間的一個重要區別是匿名類仍然是一個類的聲明。lambda表達式不會創建新類(或者不一定,如果它是實現細節)。我有這樣的印象:只有*聲明才允許註釋*。 *表達式*允許註釋嗎? – Lii

回答

13

一個Stackoverflow問題的存在不足以表明這樣的功能是有計劃的,甚至不會有人在考慮它它。

如果你看看list of JEPs,你會發現沒有這樣的JEP,即使在草稿狀態下也沒有這樣的特徵。另外,如果您查看Java 9的LambdaMetafactory的當前狀態,您將看到沒有更改支持傳遞生成帶有記錄註釋數據的運行時類所需的元信息。

似乎有一些想要添加大量的元信息到實際應該是一小塊丟棄代碼,但我懷疑語言設計師會遵循它。 Lambda表達式旨在定義封裝行爲的函數,而不是描述匿名類的替代方法。長期的演變將導致lambda表達式的實現,它甚至不是普通的類。

+2

'......更不是一個普通的班級'我不能等待發生這種情況, – Eugene

7

按照What's new in Oracle JDK 9頁,第這並沒有在Java中9

當然改變,即不明確的,但JLS的Java 9一直沒有被釋放。

6

有趣的是他們做的註釋內部類「代表」通過在InnerClassLambdaMetafactory.spinInnerClass lambda表達式:

mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true) 

但是,這顯然是一個註釋類,而不是一個拉姆達每本身。

註解拉姆達將需要改變invokedynamic和隱含的LambdaMetafactory據我可以看到 - 當invokedynamic將創建拉姆達一類會發生什麼,但別的,會發生什麼對那些註釋?