Java – OnClickListener中的最终变量要求

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

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 IP 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的范围是增加的吗?

final关键字是否只是确保其他地方的值没有改变,允许onClickListener存储IP的值,知道它仍然是真的吗? IP的范围是增加的吗?

从某种意义上说,是的(虽然这实际上是“范围”而不是“范围”:“范围”仍然只是IP声明和函数末尾}之间的程序文本。

实现方面,基本上发生的事情是new DialogInterface.OnClickListener() { ... }有一个名为IP的隐式字段,在对象构造期间自动初始化。 final修饰符用于通过确保局部变量IP和隐式字段IP继续引用相同的String实例来保护存在单个IP变量的抽象。