gpt4 book ai didi

java - 什么是可内联的运行时常量?

转载 作者:行者123 更新时间:2023-12-01 18:31:41 27 4
gpt4 key购买 nike

必须是 private + static + Final 才能作为编译时常量内联吗?

什么可以作为运行时常量内联?

还有:

private final ...
static final ...
final ...

最佳答案

JLS 4.12.4指定什么是“常量变量”。基本上,要求是它必须是 final,类型是原始类型或 String,值必须是常量表达式 ( 15.28 )。

常量变量的值将由字节码编译器内联。

JLS 规则不区分静态与否,也不区分不同的访问修饰符。

<小时/>

But public static final can be changed through reflection, so is it compile-time final?

是的。事实上,对常量变量的反射更改没有任何效果:

"Even then, there are a number of complications. If a final field is initialized to a constant expression (§15.28) in the field declaration, changes to the final field may not be observed, since uses of that final field are replaced at compile time with the value of the constant expression." - JLS 17.5.3

<小时/>

What can be inlinable as a run-time constant?

有趣的问题。我没有看到 JLS 中直接提到这个问题。然而,显然可以对此进行反射(reflection)(鉴于 JLS 17.5.3 所说)。

允许内联的一种情况(如果 JIT 编译器可以处理它)是一个局部变量,它要么是最终的,要么是有效最终的,并且具有 JIT 编译器可以推断的初始值设定项始终是相同的。最重要的约束是运行时内联不得改变程序的可观察行为。 (这里我们不需要考虑反射,因为局部变量无法通过反射访问或更改。)

关于java - 什么是可内联的运行时常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23894602/

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