2010-03-29 43 views
3

我試圖爲Java實現自動資源管理(類似於C#的using)。以下是我想出代碼:Java中的貸款模式/自動資源管理

import java.lang.reflect.*; 
import java.io.*; 

interface ResourceUser<T> { 
    void use(T resource); 
} 

class LoanPattern { 
    public static <T> void using(T resource, ResourceUser<T> user) { 
    Method closeMethod = null; 
    try { 
     closeMethod = resource.getClass().getMethod("close"); 
     user.use(resource); 
    } 
    catch(Exception x) { 
     x.printStackTrace(); 
    } 
    finally { 
     try { 
     closeMethod.invoke(resource); 
     } 
     catch(Exception x) { 
     x.printStackTrace(); 
     } 
    } 
    } 

    public static void main(String[] args) { 
    using(new PrintWriter(System.out,true), new ResourceUser<PrintWriter>() { 
     public void use(PrintWriter writer) { 
     writer.println("Hello"); 
     } 
    }); 
    } 
} 

請分析一下上面的代碼,讓我知道任何可能的缺陷,也建議我如何改善這一點。謝謝。

(對不起,我英文不好,我不是以英語爲母語。)

+0

我要說的一個問題是你的ResourceUser的方法不能返回一個值。在很多情況下你可能會想要。這應該很容易。 – ColinD 2010-03-29 14:52:41

回答

2

像我會修改你的using方法:

public static <T> void using(T resource, ResourceUser<T> user) { 
    try { 
     user.use(resource); 
    } finally { 
     try { 
      Method closeMethod = resource.getClass().getMethod("close"); 
      closeMethod.invoke(resource); 
     } catch (NoSuchMethodException e) { 
      // not closable 
     } catch (SecurityException e) { 
      // not closable 
     } 
    } 
} 

此外,您還需要定義你想要的行爲資源不是可關閉的情況(當您發現上述例外情況時)。您可以拋出特定的異常,如UnclosableResourceException或完全忽略此情況。你甚至可以用這兩種行爲實現兩種方法(usingtryUsing)。

+0

我不明白如何忽視永遠是一個有效的選擇。將某些東西傳遞給沒有定義緊密方法的方法會是一個編程錯誤,如果您認爲某些東西正在關閉但它不會被忽略,則會導致錯誤被忽視。更不用說每次創建的例外成本。 – ColinD 2010-03-29 14:56:34