gpt4 book ai didi

Java:在范围退出时自动调用函数(如 C++ 析构函数)

转载 作者:搜寻专家 更新时间:2023-10-31 08:12:41 25 4
gpt4 key购买 nike

对于 mysql 连接,我有一个连接对象并使用事务机制 connection.startTransaction()connection.commitTransaction()connection.rollbackTransaction( )

对于每个 startTransaction(),必须始终调用 commitTransaction()rollbackTransaction()。错过这样的调用或调用两者都会破坏我的交易系统。

所以我按以下方式使用它们:

boolean i_am_in_a_transaction=true;
try {
connection.startTransaction();
...
i_am_in_a_transaction=false;
connection.commitTransaction();
} finally {
if(i_am_in_a_transaction) {
connection.rollbackTransaction();
}
}

这确保了声明的调用顺序,但需要付出很多努力,因为我必须在使用事务的所有地方都写上这行代码。

在 C++ 中,如果 commit() 函数被调用,我会使用一个事务对象检查其析构函数,否则调用 rollback():

class Transaction {
public:
Transaction()
:am_in_transaction(false) {
}

~Transaction() {
if(_am_in_transaction) {
rollback();
}
}

void startTransaction() {
_am_in_transaction=true;
...start Transaction...
}

void commit() {
_am_in_transaction=false;
...commit Transaction...
}

void rollback() {
_am_in_transaction=false;
...rollback Transaction...
}

private:
bool _am_in_transaction;
}

这样我就可以在一个地方实现逻辑并且可以非常简单地使用它:

Transaction my_transaction;
my_transaction.startTransaction;
...
my_transaction.commit();

这段代码比上面带有 try/finally block 的 java 代码简单得多。

有没有一种方法可以在 java 中实现这种行为,而无需将逻辑专用于调用者并让他实现 try/finally block ?

在作用域退出时自动调用函数的方法对我有帮助。

最佳答案

与 C++ 中的析构函数相似(非常重要)的是方法 finalize()。不同之处在于,无法保证垃圾收集器何时真正调用它,因此不推荐依赖它。

否则,您能做的最好的事情就是 try/finally block 。

关于Java:在范围退出时自动调用函数(如 C++ 析构函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7917402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com