2014-02-24 46 views
1

我知道我可以寫一個動態代理是這樣的:我可以在Java中使用`new X()`返回一個動態代理嗎?

public class DecoratedFile implements java.lang.reflect.InvocationHandler { 

    private Object delegate; 

    public static Object newInstance(Object delegate) { 
     return java.lang.reflect.Proxy.newProxyInstance(
       obj.getClass().getClassLoader(), 
       obj.getClass().getInterfaces(), 
       new DecoratedFile (delegate)); 
    } 

    private DecoratedFile (Object delegate) { 
     this.obj = obj; 
    } 

    public Object invoke(Object proxy, Method m, Object[] args) 
     throws Throwable 
    { 
     ... do something to `delegate` 
    } 
} 

...它可以被實例化,像這樣:

File decorated = DecoratedFile.newInstance(new File("README.txt")); 

有沒有寫一個類,這樣我可以實例化的方式使用「新」關鍵字的動態代理:

File decorated = new DecoratedFile(new File("README.txt")); 

例如,重構非動態實現而不影響其客戶端。

如果答案是「不,你不能」 - 背後是否有設計原則?

+0

我不明白你的意思是「重構非動態實現而不影響其客戶端」。通過能夠執行'新的DecoratedFile()'而不是'DecoratedFile.newInstance()',你會獲得什麼? –

+0

@JBNizet想象我已經在其他人使用的庫中實現了DecoratedFile。數十個該庫的用戶通過他們的代碼實現了新的DecoratedFile()。如果我改變它需要'DecoratedFile.newInstance()'我打破向後兼容性。 – slim

+0

'File'不是'final'類,你可以擴展它。 –

回答

1

「背後的設計原則」是JLS這樣說。

您需要的是工廠模式或抽象工廠模式,無論它們之間的差異如何。我從來沒有想過爲什麼有兩個。

相關問題