当前位置: 首页 > 面试题库 >

Java-OnClickListener中的最终变量要求

彭涵衍
2023-03-14
问题内容

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

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增加了吗?


问题答案:

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

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

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



 类似资料:
  • 问题内容: 任何人都可以告诉我在Java上下文中以下行的含义是什么: 除非变量是不可变的,否则仍然可以对其进行操作 据我所知,通过将任何变量声明为final,就无法再次对其进行更改,那么上一行中 不可变 一词的含义是什么? 问题答案: 这意味着,如果您的最终变量是引用类型(即不是像int这样的基元),则只有引用是不能更改的。不能使它引用不同的对象,但是如果类允许,它所引用的对象的字段仍可以更改。例

  • 问题内容: 将变量声明为的区别是什么 要么 如果我只希望变量是局部的,并且是常量(以后不能更改)? 谢谢 问题答案: 仅仅具有预期的效果。 声明static使其成为一个类变量,使其可以使用类名进行访问

  • 问题内容: 在lambda中,局部变量需要是最终变量,而实例变量则不需要。为什么这样? 问题答案: 字段和局部变量之间的根本区别在于,当JVM创建lambda实例时,将复制局部变量。另一方面,字段可以自由更改,因为对它们的更改也将传播到外部类实例(它们的范围是整个外部类,如Boris所指出的)。 考虑到匿名类,闭包和Labmdas的最简单方法是从可变范围的角度来看。想象一个为传递给闭包的所有局部变

  • 在Java8中,Java设计者提出了一个有效的final变量的概念,即一个如果被“final”追加就不会给编译器带来错误的变量。我的问题是,这个新提出的“有效最终”概念比经典的“最终”提供了什么?作为一名Java开发人员,我实际上得到了什么好处?

  • 问题内容: 关键字如何使变量不可变?维基百科说没有。 问题答案: 在Java中,术语 final 是指引用,而不 可变 是指对象。将修饰符分配给引用意味着它不能更改为指向另一个对象,但是如果对象是可变的,则可以对其进行修改。 例如: 就像Wikipedia文章中提到的那样,如果您来自C ++,则必须分离出into 和不可变的概念。

  • 问题内容: Java中的最终变量是什么?例如:如果我在函数中编写final关键字的含义是什么? 另外,什么时候我要使用最终变量(既作为类变量又作为函数变量)? 为什么必须将同步块中的变量声明为final? 问题答案: 基本上,这只是意味着您无法更改该值。对于实例变量,您必须在构造函数中(或使用变量初始值设定项)分配所有最终变量一次(并且仅分配一次)。同步是一个非常正交的概念。 将 局部 变量设为f