gpt4 book ai didi

java - final 关键字并在 java 中将连接对象声明为 final

转载 作者:行者123 更新时间:2023-11-29 07:47:04 29 4
gpt4 key购买 nike

我必须将一个 java.sql.Connection 对象传递给一个匿名内部类,这意味着我必须对它进行 final 引用。但是,我担心任何资源泄漏。

public static String foo(final Connection conn){
...
@Override
public String call() {
...
return runner.query(connection, sql, scalarHandler);
}
}

我无法理解 final 关键字的内部工作原理。它实际上是如何密封对象的,所以它不能被更改为引用另一个对象?将 Connection 对象声明为 final 是否安全?

最佳答案

How does it actually seal the object so it can not be changed to reference another object?

小心——final 是对对象的引用 的修饰符。所以final“密封”了引用,而不是对象。

有两种方法可以完成这种“密封”。一种是通过编译器检查所​​有 final 变量和字段。来自 Java 语言规范:

It is a compile-time error if a final variable is assigned to unless it is definitely unassigned immediately prior to the assignment.

A blank final class variable must be definitely assigned by a static initializer of the class in which it is declared, or a compile-time error occurs.

A blank final instance variable must be definitely assigned at the end of every constructor of the class in which it is declared, or a compile-time error occurs.

另一种方式是通过 JVM 在类加载时完成的字节码验证。 putfieldputstatic 字节码指令抛出 IllegalAccessError 如果正在操作的字段是 final 并且字节码指令没有不会发生在特定的地方。

但是,您在这里必须小心一点——final 关键字仅“粘附”在字段上。临时变量和参数在编译时会失去它们的 final 特性,因此如果您使用不兼容的编译器或使用字节码操作,JVM 只能验证字段的 final 特性。


Is it safe to declare a Connection object as final?

我不完全确定你所说的“安全”是什么意思,但是如果你说“不会在你的程序中导致错误”,是的,在大多数情况下(存在多线程和/或编译-时间常数可能会也可能不会改变这个答案)。如果您将 final 放在引用上并且您的程序可以编译,那么您的程序应该可以正常运行。

关于java - final 关键字并在 java 中将连接对象声明为 final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24814455/

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