[英]Java initializing iVars outside the scope of any method
Java的新手,我对这段代码有些困惑:
public class CitiesDialog extends DialogFragment {
private AsyncHttpClient client = new AsyncHttpClient();
}
客户端正在任何方法范围之外初始化。 这到底是什么意思? CititiesDialog的每个实例是否都有单独的客户端对象? 还是这是某种静态/类变量?
最后,这是Java的规范吗? 初始化超出构造函数/方法等范围的变量...
谢谢
client
是CitiesDialog
的实例变量
您创建的每个CitiesDialog
都将拥有自己的client
。
这种初始化仅适用于您首次创建类的实例的情况。 您可以随后更改client
。
这在Java中完全正常。
您在这里看到的是private AsyncHttpClient
,它本身只是一个类变量。
然后,您会看到声明new AsyncHttpClient()
,该声明已分配给client
。 对于创建的每个新对象都会发生这种情况。
解决这是否是常态? 我认为是的,常见的用例是列表,最好尽早初始化它们:
public class A {
private final List<String> list = new ArrayList<>();
}
这将防止您以后再获得NPE
,因为您忘记了声明列表。
另一件事也有帮助,那就是声明字段final
如果在赋值后再也不要更改它,那么编译器还可以确保在声明或构造函数中对该字段进行初始化。
CititiesDialog的每个实例是否都有单独的客户端对象?
是的,因为它没有标记为static
。
这是Java中的规范吗? 初始化超出构造函数/方法等范围的变量...
这不是异常,特别是如果您有多个构造函数并且不想重复初始化。
最后,这是Java的规范吗? 初始化构造函数/方法范围之外的变量
实际上,这只是语法糖,因此不需要在每个构造函数中重复相同的初始化。 编译后,初始化代码将成为每个构造函数的一部分(委托给其他构造函数的那些除外)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.