gpt4 book ai didi

java - 一段时间后将变量声明为常量 - 解决方法是什么

转载 作者:行者123 更新时间:2023-12-01 19:30:22 25 4
gpt4 key购买 nike

情况编码如下:

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;


import android.os.Bundle;

import com.makeIT.www.R;

public class MainScreenActivity extends AppCompatActivity {
/*final*/static Toolbar app_toolbar = null; //would like to declare constant here but,

private Toolbar return_toolbar(){

return findViewById(R.id.app_toolbar);
}


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activityscreen_main);
app_toolbar = findViewById(R.id.app_toolbar);/*findViewById isn't available till here*/

所以,我想让 View static final,但正如您所看到的,findViewById 在布局设置后才可用。因此,我只能将其设为静态。 (在这种情况下,不进行最终不会有什么坏处,但如果有解决方法,我想知道。)

编辑:我在这里想做的是将 app_toolbar 作为静态可用(即没有任何实例关联),但也可作为常量,但您会看到两者都会发生 app_toobar 应该在中定义类而不是方法之一。一种方法是手动调用 onCreate (如果可能的话),但是 Bundle 对我们来说同样不可用。是否可以重载 onCreate ?如果是,我们如何获取 Bundle 因为我们可能想保存状态

最佳答案

基本上,您是在询问是否可以更改 final 变量。

答案:这取决于情况。

  • 如果final是编译时常量,则否。没有实际的方法可以做到这一点。该常量将由字节码编译器内联,并且更改包含该常量的字段将不会产生任何影响...除了以反射方式访问该字段的其他代码。

  • 如果final不是编译时常量,则无法在纯Java中执行此操作。但是,您可以使用反射来更改 final 变量的 Field 对象上的修饰符标志,然后更改变量的值。

但是,通过反射修改 final 字段是不安全的。 Java JIT 或 AOT 编译器可能会生成假定 final 的值不会更改的 native 代码。如果通过反射更改值,则更改后的值可能不可见。此外,这可能无法通过内存模型来修复;例如通过添加具有发生在关系的操作。

修改 Java 语言规范中明确讨论的 final 变量;请参阅JLS 17.5.3 .

我的建议:不要这样做。找出解决您问题的另一种方法。

关于java - 一段时间后将变量声明为常量 - 解决方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59927349/

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