Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 声明一个外部类变量final以在内部类中访问它被认为是一种好的实践吗?_Java_Android_Optimization - Fatal编程技术网

Java 声明一个外部类变量final以在内部类中访问它被认为是一种好的实践吗?

Java 声明一个外部类变量final以在内部类中访问它被认为是一种好的实践吗?,java,android,optimization,Java,Android,Optimization,在Java中,当需要从内部类访问外部类成员或变量时,必须将其声明为final。看 我的问题是:这是一个好的做法吗 特别是当我为android编写代码时,我经常使用与此类似的解决方案: final EditText textView = (EditText) setUrlDialog.findViewById( R.id.dialog_text_set); textView.setText(urlTw.getText()); alertDialogBulder.setPositiveBu

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

我的问题是:这是一个好的做法吗

特别是当我为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
        }
});

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

继续这样做。这已经是一个麻烦的语法,但是在java中使用闭包会有所改进。
否则您每次都需要创建一个新类,这肯定不会有更好的性能。

我认为在全局上声明变量,那么您不必为它使用final修饰符,您也可以通过类及其内部类访问此变量,在这方面也没有任何性能问题

就你而言

如果您声明
EditText文本视图在全局上方
onCreate()
则不需要使用final修饰符

大概

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

            }
});
}
}
(如果我错了,请让我知道这一点。

您将EditText声明为 私有编辑文本视图;
然后,您可以在内部类中使用外部类变量。

由于示例中的textView不应该被到处使用,因此它为您提供了更高的可读性来执行您已经在执行的操作,因为变量的使用接近其定义。必须使用最终修改器只是一个技术性问题,不会导致任何性能损失


将此与将textView声明为字段进行比较。如果textView是一个字段,那么声明中肯定不清楚它在哪个上下文中使用。它还可能造成(轻微的)性能损失,因为如果外部字段声明为private,则内部类将需要一个合成的访问器对象来访问外部字段

在这种情况下,不要太担心“良好实践”,因为使用“内部类”本身被认为是一种不好的实践

在这里,您可以了解有关该问题的更多信息:


是的,在外部类中有数百个不必要的实例变量,这使得读取变得更加困难。性能优势?不存在,事实上,如果不将变量存储在内部类中,访问它的成本可能会更高(额外的间接寻址、可能的缓存未命中等),或者存储两次,这只会增加实例的大小(理论上,缓存中的访问量会更少)没有性能问题,更多的局部变量定义和标准习惯用法=win。