2015-04-02 70 views
1

Java 8中有一個令人驚訝的新功能:接口上的默認方法。實際上令人驚訝的是,即使是JDK自己的豆子Introspector does not support也是如此。而且由於Java 8是全新的,僅僅被髮布了一年左右,所以假設它很快就不會被修復是安全的。JFace數據綁定不支持默認方法

所有這些意味着JFace Databinding無法支持默認方法,這是一個問題,正如您可以想象的那樣。我們已經有了一個自己的Instrospector,但是有沒有人知道我們如何擴展/修復/修補數據綁定來使用它,而不是非工作的默認設置?

一些細節:在錯誤報告的接口:

public static interface Named { 

    public default String getName() { 
     return "always the same"; 
    } 
} 

異常會看起來像:

java.lang.IllegalArgumentException: name property does not have a read method. 
    at org.eclipse.core.internal.databinding.beans.BeanPropertyHelper.readProperty(BeanPropertyHelper.java:94) 
    at org.eclipse.core.internal.databinding.beans.PojoValueProperty.doGetValue(PojoValueProperty.java:47) 
    at org.eclipse.core.databinding.property.value.ValueProperty.getValue(ValueProperty.java:57) 

我們使用數據綁定1.4.0,這是版本下載網站甚至提供了Eclipse 4.4.2,我在某處看到了1.4.2版本,但是在一些沒有結果的嘗試之後,我開始相信這超出了我交換插件的能力。

+1

的屬性名稱系分割的代碼,你能否澄清,如果你真的想綁定一個默認的方法或者如果你認爲它不起作用? – 2015-04-02 06:44:54

+0

@RüdigerHerrmann如果使用'PojoObservables.observeValue(object,「name」)綁定,它將使用默認的Java Introspector,即使在最新的JFace版本中也是如此。所以沒有辦法讓它工作。 – 2015-04-02 07:03:36

+0

我可以用'PojoProperties.value(Pojo.class,「defaultMethod」).observe(dataBindingContext.getValidationRealm(),pojo)''成功綁定,其中Pojo.class是'set/getDefaultMethod()'的接口 - 不完全確定與PojoObservables.observeValue()不同的地方在哪裏。如果這對你來說不是一個可行的方案 - 你有沒有考慮過替換'PojoProperties.value'?這是observeValue的調用結束並獲得「PropertyDescriptor」的地方。運氣好的話,你可以使用你自己的'PropertyDescriptor'派生的實現。 – 2015-04-02 08:52:11

回答

0

我能指定接口類型這樣當綁定到默認的方法支持的特性:

IObservableValue observableValue = PojoProperties.value(Named.class, "name").observe(realm, named); 
observableValue.setValue("name"); 

如果這個方法行不通了你,你可以創建一個PojoValueProperty自己並傳遞自定義創建PropertyDescriptor

PropertyDescriptor propertyDescriptor = ... 
IObservableValue observableValue = new PojoValueProperty(propertyDescriptor, null).observe(realm, named); 

但你會看到,上面的代碼訪問內部類,你可能想複製的PojoObservables.value()

+0

也許這就是爲什麼這對我不起作用的原因:我們有bean,它可能會或可能不會從接口繼承方法,所以我們只能綁定到bean類。但也有很多其他的框架不支持這個,所以我們認爲我們必須採用痛苦的方式來改變bean,以覆蓋接口方法(調用super),直到每個人都這樣做。 – 2015-04-09 05:19:27