2017-03-17 70 views
0

我製作了一個自定義類,它帶有一個.close()方法。我想知道如何強制客戶端在使用我的對象後始終調用此方法以確保該對象適當地關閉並釋放它正在使用的任何資源?強制客戶端關閉對象

即: 假設我有一個對象

public MyObject { 
    public MyObject() { 

    } 
    method1() { 
    //do some stuff. 
    } 
    method2() { 
    //do some other stuff. 
    } 
    close(){ 
    //cleans up resources utilized by this object. 
    } 
} 

和客戶端:

public static void main(String[] args) { 
    MyObject my = new MyObject(); 
    my.method1(); 
    my.method2(); 
    my.close(); 
} 

以上應該工作。然而,

public static void main(String[] args) { 
    MyObject my = new MyObject(); 
    my.method1(); 
    my.method2(); 
} 

不應該工作(不理想編譯或給予某種形式的警告),因爲該對象永遠不會使用後關閉。

+1

我不認爲這是可能的(AFAIK) – 2017-03-17 22:13:12

回答

1

我做了一個自定義的類,它帶有一個.close()方法。我想知道如何強制客戶端在使用我的對象後始終調用此方法以確保該對象適當地關閉並釋放它正在使用的任何資源?

我建議讓你的類實現AutoClosable界面,並使用try with resource

public MyObject implements AutoCloseable{ 
    // ... 
    @Override 
    close(){ 
    //cleans up resources utilized by this object. 
    } 
} 


public static void main(String[] args) { 
    try(MyObject my = new MyObject();){ 
     my.method1(); 
     my.method2(); 
    } // calls 'close()' when leaving this block even when exception occures 
} 
+0

我最終實現了Closeable。儘管如此,仍然以我希望的方式工作。謝謝! – fuzzyblankey

0

我要發表評論,但因爲我沒有足夠的聲譽我寫它作爲一個答案。

正如答案中所提到的,你可以實現AutoCloseable,但是如果你不想實現它,另一個想法是添加init()方法,你將啓動ressources,並在每個方法體內調用init()最後開始並關閉()。

您的代碼會像:

public MyObject { 
    public MyObject() { 

    } 
    init() { 
     //initiate ressources. 
    } 
    method1() { 
     init(); 
     //do some other stuff. 
     close(); 
    } 
    close(){ 
     //cleans up resources utilized by this object. 
    } 
} 

但是如果性能是關鍵的因素應該是更好地執行AutoCloseable。