为啥在方法参数中使用 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章