声明一个外部类变量final是否在内部类中被认为是良好实践?

时间:2011-12-07 13:10:12

标签: java android optimization

在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
        }
});

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

5 个答案:

答案 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)

在这种情况下,不要过分担心“良好做法”,因为使用“内部阶级”本身就被认为是一种不好的做法。

您可以在此处获得有关该问题的更多信息:

Why so many inner classes in Android?