我一直在阅读关于finalize()的很多新手Java问题,并发现有点令人困惑的是,没有人真正说明finalize()是一种不可靠的清理资源的方法.我看到有人评论说他们用它来清理Connections,这真的很可怕,因为接近Connection的关闭的唯一方法就是最终实现try(catch).
我没有受过CS的教育,但是我已经用Java专业编程近十年了,我从未见过有人在生产系统中实现finalize().这仍然不意味着它没有它的用途,或者我与之合作过的人一直在做正确的事.
所以我的问题是,实现finalize()的用例是什么,无法通过语言中的其他进程或语法更可靠地处理?
请提供具体的方案或您的经验,只是重复Java教科书,或最终确定的用途是不够的,这不是这个问题的意图.
自从我使用Java以来已经至少5年了,当时,只要你想分配一个需要清理的对象(例如套接字,数据库句柄),你就必须记得添加一个finally块并调用清理方法.那里.
相比之下,在C++(或其他对象生命周期是确定性的语言,例如Perl)中,类实现者将定义一个析构函数,只要该类的对象超出范围,该函数就会执行清理.这种方法的优点是对象的用户不会忘记清理它 - 即使抛出异常,也会自动调用析构函数.这种方法以RAII的相当可怕的名字命名 - "资源获取是初始化".
根据我的经验,做"RAII方式"的事情在不必担心是否以及何时发生资源解除分配方面为我节省了大量精神开销.我们正在考虑将Java用于一个中型项目,我想知道自从我上次查看它以来,语言中添加的许多新功能是否存在某种确定性破坏.(我希望因为我的抱怨"Java没有RAII" 在这个帖子上被斥责,但到目前为止我还没能通过谷歌搜索找到任何细节.)
所以,如果有人能够指出一些关于如何在Java中实现这一目标的介绍性材料,那就太棒了!
我们在Java中没有像Java一样的Java中的析构函数.
Q1.我们应该如何清理java中的任何Object.
Q2.是否有替代finally块.
Q3.有时我们必须从我们的类中明确地调用初始化/终止第三方代码,例如
public classs MyClass{
public MyClass(){
ThirdPartyInitialize();
}
protected void finalize(){
ThirdPartyTerminate();
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?
我是Kotlin的新手,已经在kotlin写了一个类来执行数据库操作
我使用init在构造函数中定义了数据库连接,但我想使用析构函数关闭数据库连接.
有关如何使用kotlin析构函数实现此目的的任何想法?
目前我已经写了一个单独的函数来关闭连接,我希望它像使用任何其他编程语言一样使用析构函数,如php等
例如:
/**
* Constructor
*/
public Test(InputStream in){
try{
this.inputStream = in;
} finally{
inputStream.close();
}
}
Run Code Online (Sandbox Code Playgroud)
在创建Test对象后,传递给教师的InputStream是否立即关闭?或者,当Test对象被销毁时它是否关闭?我不知道如何在C++中实现类似于析构函数的东西.
在Java中,我将如何执行以下操作:
Foo bar = new Foo();
Foo a = bar;
Foo b = bar;
bar = null;//will only set bar to null. want to set value of bar to null rather than the reference to null.
Run Code Online (Sandbox Code Playgroud)
是否可以设置变量bar,a并且b(都是引用bar)仅在访问bar时为null?如果是这样,有人可以解释如何这样做.
Java有自己的垃圾收集实现,因此它不需要像C++这样的任何析构函数.这使得Java开发人员懒得实现内存管理.
我们仍然可以使用析构函数和垃圾收集器,开发人员可以在其中释放资源并且可以节省垃圾收集器的工作.这可能会提高应用程序的性能.为什么Java不提供任何析构函数的机制?
开发人员无法控制GC,但他/她可以控制或创建对象.那么为什么不给它们破坏物体的能力呢?
最简单的形式,以下是设计:
class Session {
Timer t = new Timer();
// ...
};
Run Code Online (Sandbox Code Playgroud)
每当Session分配时,我会在其中启动一个计时器; 计时器将在10-20分钟后过期.现在,假设Session在计时器到期之前是否销毁了; 那么这是我必须停止计时器的场景.我不知道是否有任何最后一个方法在Session被销毁时总是被调用.
在Java中是否有某种类似的C++析构函数,它可以cancel()在Session销毁时帮助我计时器?(无需等待GC)
编辑:请不要重新加入C++.我想要一些相同的东西.这Session是一个电话会话,当连接到它的所有用户都断开连接时会被破坏.现在,没有Session最后调用的方法,也没有任何异常.
public class A {
double wage;
A(double wage){
this.wage=wage;
}
}
Run Code Online (Sandbox Code Playgroud)
//在这段代码中,我应该定义构造函数和析构函数.
java ×9
destructor ×4
constructor ×1
jvm ×1
kotlin ×1
oop ×1
raii ×1
reference ×1
try-finally ×1