强制客户端关闭对象

时间:2017-03-17 21:55:57

标签: java class oop object

我制作了一个自定义类,其中包含.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();
}

不应该工作(理想情况下不能编译或发出某种警告),因为该对象在使用后永远不会关闭。

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

答案 2 :(得分:0)

我想发表评论,但由于我没有足够的声誉,我把它写成答案。

如答案中所述,您可以实现AutoCloseable,但如果您不想实现它,另一个想法是添加init()方法,您将在其中启动ressources并在每个方法体中调用init()在开始时并在最后关闭()。

您的代码将如下:

loBridge = CREATEOBJECT("wwDotnetBridge","V4")
loBridge.LoadAssembly("MyAssembly.dll")
loInstance = loBridge.CreateInstance("MyNamespace.MyClass")

loInstance.DoSomething(parm1)
loBridge.InvokeMethod(loInstance,"SomeOtherMethodWithUnsupportedTypeParms",int(10))

但如果性能是关键因素,那么实现AutoCloseable应该更好。