2017-03-17 98 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。