2008-09-12 83 views
6

在C++中,我們在構造函數中獲取資源並在析構函數中釋放資源。java中的無痛資源管理

因此,當一個函數中間出現異常時,將不會有資源泄漏或鎖定的互斥鎖或任何東西。

AFAIK java類沒有析構函數。那麼我們如何做Java中的資源管理。

例如:

public int foo() {  
    Resource f = new Resource(); 
    DoSomething(f); 
    f.Release(); 
} 

如何可以的,如果DoSomething的拋出一個異常,一個釋放資源?我們不能在代碼中放置try \ catch塊,我們可以嗎?

回答

4

是的,你可以,應該把你的代碼周圍try/catch/finally塊。在C#中有一個速記「使用」的聲明,但在Java中你被卡住:

public int foo() { 
    Resource f = new Resource(); 
    try { 
     DoSomething(f); 
    } 
    finally { 
     f.Release(); 
    } 
} 
0

如果你想使用塊涉足的java結束辯論:S

+0

哪裏是在辯論? – Spoike 2008-09-12 09:36:07

+0

遍佈互聯網: http://www.google.dk/search?q=java+closures – svrist 2008-09-20 15:38:23

-1

抱歉讓你們失望,但在Java中,我們使用try \ catch \ 終於阻止了很多。 「很多」,我的意思是A LOT。我有時希望Java具有C#使用塊。大多數情況下,您不需要釋放資源,因爲Java的垃圾回收器會照顧到這一點。

但是,異常在使錯誤處理更加清晰的情況下有其用處。你可以編寫你自己的例外,併爲你正在做的任何事情捕捉它們。不再向用戶返回任意的錯誤代碼!

+1

是的!讓我們開始將他們難以理解的堆棧痕跡返回給他們! – 2008-09-12 09:57:00

3

使用Execute around idiom可以將try/finally(以及異常和算法)分解出來。但是,語法非常冗長。

public int foo() { 
    withResource(new WithResource() { public void run(Resource resource) { 
     doSomething(resource); 
    }}); 
} 

... 

public interface WithResource { 
    void run(Resource resource); 
} 

public static void withResource(WithResource handler) { 
    Resource resource = new Resource(); 
    try { 
     handler.run(resource); 
    } finally { 
     resource.release(); 
    } 
} 

這樣的事情更有意義,如果你是抽象比try/finally更多。例如,使用JDBC,您可以執行語句,循環遍歷結果,關閉資源幷包裝異常。