在Java中,当您需要从内部类访问外部类成员或变量时,必须将其声明为final。请参阅this question。
我的问题是:这是一个好习惯吗?
特别是当我为android编写代码时,我经常使用与此类似的解决方案:
final EditText textView = (EditText) setUrlDialog.findViewById(
R.id.dialog_text_set);
textView.setText(urlTw.getText());
alertDialogBulder.setPositiveButton(R.string.ok,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
textView.getText()
//Do something with the text
}
});
这种解决方案会导致性能问题吗?还有其他原因可以避免频繁使用此解决方案吗?
答案 0 :(得分:2)
由于示例中的textView不应该在整个地方使用,因此它可以提供更高的可读性来执行您已经在做的事情,因为变量的使用接近其定义。必须使用最终修饰符只是一种技术性,并且不会造成任何性能损失。 More information
将此与将textView声明为字段进行比较。如果textView是一个字段,那么从声明使用它的上下文中肯定不清楚。它还可以创建(次要)性能损失,因为内部类将需要合成访问器对象来访问外部字段(如果它被声明为私有)。 See here for a discussion on accessor objects
答案 1 :(得分:1)
我认为全局变量声明,然后你不必使用最终修饰符,你也可以通过类来访问这个变量它的内部类,也没有任何性能问题..
在你的情况下......
如果您在全球EditText textView;
之上宣布onCreate()
,那么您不需要使用最终修饰符,
之类的,
public class Test extends Activity {
EditText textView;
public void onCreate(Bundle savedInstanceState)
{
textView = (EditText) setUrlDialog.findViewById(R.id.dialog_text_set);
textView.setText(urlTw.getText());
alertDialogBulder.setPositiveButton(R.string.ok,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
textView.getText()
//Do something with the text
}
});
}
}
(如果我错了,请告诉我这个......)
答案 2 :(得分:0)
继续这样做。它已经是一种繁琐的语法,但是随着java中的闭包将会有所改进。 否则你每次都需要创建一个新课程,而且肯定没有更好的表现。
答案 3 :(得分:0)
您将EditText声明为 私人EditText textView; 那么你可以在内部类中使用外部类varibles。
答案 4 :(得分:0)
在这种情况下,不要过分担心“良好做法”,因为使用“内部阶级”本身就被认为是一种不好的做法。
您可以在此处获得有关该问题的更多信息: