代码之家  ›  专栏  ›  技术社区  ›  juztcode

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

  •  0
  • juztcode  · 技术社区  · 5 年前

    情况编码如下:

    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*/
    

    所以,我想 static final ,但正如你所见 findViewById 在设置布局之前不可用。因此,我只能做到 static

    编辑 onCreate (如果可能的话)但是 Bundle overloading 这个 创建时的回调函数 捆绑 既然我们想拯救国家

    1 回复  |  直到 5 年前
        1
  •  1
  •   Stephen C    5 年前

    基本上,你是在问是否有可能改变 final 变量。

    答:这要看情况。

    • 如果 最终的 是一个编译时常量,那么没有。没有实际的方法可以做到。常量将由字节码编译器内联,更改包含常量的字段将不会有任何影响。。。除了在 其他

    • 如果 最终的 不是编译时常量,因此不能在纯Java中执行。但是,可以使用反射来更改trhe上的修饰符标志 Field 对象 最终的 变量,然后更改变量的值。

    但是修改 最终的 通过反射的场是不安全的。Java JIT或AOT编译器可能会发出本机代码,假设 最终的 可能不可见 . 此外,这个 可以通过内存模型修复;例如,通过添加 以前发生过

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

        2
  •  1
  •   whd.nsr    5 年前

    这实际上是与Java相关的,而不是Android。

    你能做到的 private static ,并使 public static 返回静态值引用的getter,因此只能从外部获取静态值,但只能从类(MainScreenActivity)本身分配静态值。

        3
  •  1
  •   npinti    5 年前

    不确定这是您想要的,所以我将声明以下假设:您想要的是能够作为静态变量访问工具栏,而不管它所属的活动的状态如何。

    我要做的是创建一个工厂类,其目标是创建工具栏。但是,这将要求您做出如下更改:

    1. 您可以通过调用工厂(如果愿意,工厂可以是静态的)来获得工具栏。您可以连接工厂以返回您希望的工具栏设置。

    2. 在活动中,删除用于构造工具栏的任何代码(这需要移动到1中解释的工厂类),然后从活动中调用工厂。

    1. 您可能需要使用一些额外的逻辑来检查组件是否已呈现。

    编辑: 我很久没做过Java了(很久没碰过Android了,但是…)我的意思是这样的:

    public class ToolbarFactory {
        public static Toolbar getToolbar() {
            // In here you build your toolbar. You could move the existing code within your application which at the moment is building the toolbar.
        }
    }
    

    每当您想要获得工具栏时,可以执行以下操作: ToolbarFactory.getToolbar() 这会给你你想要的工具条。

    然后,在您的活动中,我假设您有类似的东西(下面是伪代码):

    Toolbar t = new Toolbar();
    t.setThis(this);
    s.setThat(that);
    someContainer.add(t);
    

    上面的块需要移动到工厂类并替换为以下内容:

    someContainer.add(ToolbarFactory.getToolbar());