为啥在方法参数中使用 Final [重复]

Posted

技术标签:

【中文标题】为啥在方法参数中使用 Final [重复]【英文标题】: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 用于常量。

【问题讨论】:

【参考方案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?

【讨论】:

以上是关于为啥在方法参数中使用 Final [重复]的主要内容,如果未能解决你的问题,请参考以下文章

方法参数中的final关键字[重复]

方法(String str)和方法(Final String str)有啥区别[重复]

内部使用final参数的原因

java中final用在参数中表示啥?

Java中final修饰参数的作用

java 里定义的方法参数 (final String... args)