我制作了一个自定义类,其中包含.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();
}
不应该工作(理想情况下不能编译或发出某种警告),因为该对象在使用后永远不会关闭。
答案 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)
尝试实现Closable或Autoclosable接口。
答案 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应该更好。