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修饰符,并且您还可以在整个类及其内部类中访问此变量,也就不存在任何性能问题..
您的情况...
如果在全局范围内将
类似的东西,
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中的闭包而改进。
否则,您每次都需要创建一个新的类,这肯定没有更好的性能。