【问题标题】:Why Final is used in method parameters [duplicate]为什么在方法参数中使用 Final [重复]
【发布时间】:2014-01-14 17:17:57
【问题描述】:

在编写android代码时,我遇到了以下事情

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        convertView = _inflater.inflate(R.layout.abstract_list_row_item, null);
        move.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {  
                    // if btn is clcked then data is changed an we need to refresh framents
                    MainAppDataController.getInstance().setIsDataChanged(true);
                    callWhiteListDB = new CallWhiteListDB(_context);
                    callWhiteListDB.openToWrite();
                    callWhiteListDB.insert(allContacts.get(position).name, allContacts.get(position).number);
                    callWhiteListDB.close();

                    callBlackListDB = new CallBlackListDB(_context);
                    callBlackListDB.openToWrite();
                    callBlackListDB.deleteSingleItem(allContacts.get(position).dbId);
                    callBlackListDB.close();
                    populateList(position);
                    notifyListView(view);
                }
            });
        return convertView;

在上面的示例中,getView() 方法具有 int position、View convertView、ViewGroup parent 等参数。我的观察是在我开始在onclick() 中使用位置变量时,Eclipse 抛出编译错误并要求将位置设置为最终位置。为什么我要把它定为final? AFAIK final 用于常量。

【问题讨论】:

    标签: java android


    【解决方案1】:

    final 用于方法 参数中,以使引用 不可更改 在传递到方法后。这是一种保护传递参数的特殊方法。因此,接收方法将无法使用新对象或值重新初始化它

    【讨论】:

      【解决方案2】:

      您在匿名内部类中使用position。因此,要求位置是最终的。

      匿名类无法访问其封闭范围内未声明为 final 或有效 final 的局部变量。

      final修饰符表示该字段的值不能改变。

      http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

      【讨论】:

      • 为什么会这样?final和匿名内部类有什么关系?
      • @ARP OnClickListener 是匿名内部类。
      • @ARP 检查我帖子中的链接,主题为访问封闭范围的局部变量,以及声明和访问匿名类的成员。检查第二点。
      【解决方案3】:

      我们在方法参数中使用final关键字,以防止方法内部的代码修改该参数的值。

      【讨论】:

        【解决方案4】:

        final 使您的变量保持不变。

        由于您的 onclick 方法将在此函数完成后被调用,并且您的变量将不再存在,因此当您使用最终变量时,它的常量值将在 onclick 中传递。

        【讨论】:

          【解决方案5】:

          这是因为getView 在你的listView 膨胀布局时被调用......而onClick 在你的view (move) 被按下时被调用......当时它的onClick被触发,变量@987654325 @ in getView 已经被销毁了...通过将其设为 final,您可以确保保留 position 的值以供以后使用

          【讨论】:

            【解决方案6】:
            • 可以使用关键字 final 声明 java 变量。然后 final 变量只能赋值一次。

            • 声明为 final 但未初始化的变量称为 空白最终变量。一个空白的最终变量强制构造函数 初始化它。

            • 声明为 final 的 Java 类无法扩展。限制 继承!

            • 声明为 final 的方法不能被覆盖。在私有方法中 等于final,但在变量中不是。

            • 最终参数 – 参数值在之后不能更改 初始化。做一个小的 java 练习来找出其中的含义 方法覆盖中的最终参数。

            • Java 本地类只能引用本地变量和参数 被声明为最终的。

            • 将 java 变量声明为 static final 的一个明显优势是, 编译后的 java 类会带来更快的性能。

            更多信息请阅读this

            另见Use of final keyword in Java method performance?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-07-22
              • 2014-05-11
              • 2017-10-05
              • 2012-05-14
              • 2010-10-04
              • 1970-01-01
              相关资源
              最近更新 更多