Java让我声明变量为final,但后来不让我写信给它

时间:2016-10-11 04:10:56

标签: java android final

我在使用Java for Android时遇到了一个奇怪的问题。我正在创建一个按钮的监听器,我需要将文本编辑作为字符串抓取并将其返回到字符串中以用作身份验证检查。
我收到一个错误,我需要将变量AccessCraw声明为final,当我将其创建为final时,它表示我无法对其进行编辑。如何在不产生大量错误的情况下预先形成这一点? (以下代码)

    boolean loggedin = (false);
    boolean acsessgranted = (false);
    final String AccessCraw = "no";
    Button submit = (Button) findViewById(R.id.Submit);
    Button startBtn = (Button) findViewById(R.id.EmailAdmin);
    final EditText AccessCode = (EditText) findViewById(R.id.ACentry);

    if(acsessgranted == (false)) {
        setContentView(R.layout.activity_frun);
    }

    if(acsessgranted == (true)) {
        if(loggedin == (false))  {
            setContentView(R.layout.login);
        }
    }

    if(acsessgranted  == (true)) {
        if(loggedin == (true))  {
            cont ();
        }
    }

    startBtn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            sendEmail();
        }
    });
    submit.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            AccessCraw = AccessCode.getText().toString();
        }
    });
}

4 个答案:

答案 0 :(得分:0)

我认为这是你需要知道的:

  

如果您不将EditText放在clas范围的范围内,而是   在OnCreate中声明它,它希望它被声明为final。

所以在clas范围内声明你的EditeText。

答案 1 :(得分:0)

这与popular issue in JavaScript非常相似。您不需要从异步事件中分配全局变量。而是调用一个使用该值作为参数的方法。

从事件处理程序内部调用需要异步值的代码。

答案 2 :(得分:0)

每当您收到此警报时,请将变量设为全局 原因?当您在innerclass中使用变量时,它会生成该变量的新副本,并且对其所做的任何更改都不会反映在外部。所以我们声明变量final并且不进行任何更改以避免冲突,但是如果需要对该变量进行更改,则将其设置为全局,以便它对所有类具有相同的访问权限,并且不会创建重复项。阅读java文档了解更多详情。

正如其中一个答案中所提到的,为了保留数据安全性,建议使用setter和getter来操作内部类或异步menthods中的变量。

答案 3 :(得分:0)

故意将变量声明为final是为了防止其值在将来被更改。显然,这就是为什么你无法改变价值的原因。

Android和java一般来说,如果要在内部类中使用它们,则需要将未在全局(类级别)范围内声明的变量声明为final。这是为了防止变量发生变化。

正如其他人所提到的,如果您需要String以值开头,请在全局范围内声明它。