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"));
例如,重構非動態實現而不影響其客戶端。
如果答案是「不,你不能」 - 背後是否有設計原則?
我不明白你的意思是「重構非動態實現而不影響其客戶端」。通過能夠執行'新的DecoratedFile()'而不是'DecoratedFile.newInstance()',你會獲得什麼? –
@JBNizet想象我已經在其他人使用的庫中實現了DecoratedFile。數十個該庫的用戶通過他們的代碼實現了新的DecoratedFile()。如果我改變它需要'DecoratedFile.newInstance()'我打破向後兼容性。 – slim
'File'不是'final'類,你可以擴展它。 –