小编典典

Java-OnClickListener中的最终变量要求

java

我有一个程序,其中有一个用户可以编辑的文本框。当用户按下按钮时,将创建一个对话框,显示用户的文本和确认“是/否”选项。

public void setIP(View v){
    //get the text inside the editor
    EditText et = (EditText) findViewById(R.id.editTextIP);
    final String IP = et.getText().toString();

    //create dialog 
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Set I.P. to : " + IP + " ?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    host = IP;
               }
           })
           .setNegativeButton("No", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
               }
           });
    AlertDialog alert = builder.create();
    alert.show();
}

这段代码可以正常工作,但是我的第一个版本无法编译。我的IDE抱怨我不应该创建字符串IP final,而应该这样做。

这让我开始思考。final在这种情况下会增加什么?例如,如果我选择保留对Dialog的引用,并通过另一种方法显示它,该怎么办?这意味着上面的方法将返回。那么变量如何IP持续存在呢?

final关键字是否只是确保该值不会在其他地方更改,是否允许onClickListener存储的值IP,而知道它仍然为真?范围IP增加了吗?


阅读 235

收藏
2020-11-26

共1个答案

小编典典

final关键字是否只是确保该值不会在其他地方更改,是否允许onClickListener存储的值IP,而知道它仍然为真?范围IP增加了吗?

从某种意义上讲是可以的(尽管这实际上是“范围”而不是“作用域”:“作用域”仍然只是函数的声明IP}结束之间的程序文本)。

在实现方面,实质上发生的是,该对象new DialogInterface.OnClickListener() { ... }具有一个名为的隐式字段,该字段IP在对象构造期间会自动初始化。该final修改用于保护那里是一个单一的抽象IP变化,通过确保局部变量IP和隐场IP继续指向同一个String实例。

2020-11-26