关于java:是否在内部类中声明一个外部类变量final以访问它被认为是一种好习惯?

Is declaring an outer class variable final to access it in inner class considered good practice?

在Java中,当您需要从内部类访问外部类成员或变量时,必须将其声明为final。请参阅此问题。

我的问题是:这是一个好习惯吗?

尤其是当我为android编写代码时,我经常使用与此类似的解决方案:

1
2
3
4
5
6
7
8
9
10
11
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
        }
});

这种解决方案会导致性能问题吗?还有其他原因可以避免频繁使用此解决方案吗?


由于示例中的textView不应在所有地方使用,因此,由于变量的使用接近其定义,因此它使您可以更轻松地执行已做的事情。必须使用final修饰符只是技术性问题,不会对性能造成任何影响。更多信息。

将此与声明textView作为字段进行比较。如果textView是一个字段,则从声明中使用它的上下文肯定是不清楚的。它还会造成(较小的)性能损失,因为如果内部类被声明为私有的,则需要一个综合的访问器对象来访问外部字段。有关访问器对象的讨论,请参见此处。


我认为全局声明变量,那么您不必为其使用final修饰符,并且您还可以在整个类及其内部类中访问此变量,也就不存在任何性能问题..

您的情况...

如果在全局范围内将EditText textView;声明为onCreate(),则不需要使用final修饰符,

类似的东西,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

            }
});
}
}

(如果我错了,请告诉我。.)


在这种情况下,不必太担心"良好做法",因为使用"内部类"本身被认为是不良做法。

此处您有关于此问题的更多信息:

为什么Android中有那么多内部类?


您将EditText声明为
私人EditText textView;
那么您可以在内部类中使用外部类变量。


继续这样做。它已经是一个繁琐的语法,但是将随着Java中的闭包而改进。
否则,您每次都需要创建一个新的类,这肯定没有更好的性能。