繁体   English   中英

Java在任何方法范围之外初始化iVars

[英]Java initializing iVars outside the scope of any method

Java的新手,我对这段代码有些困惑:

public class CitiesDialog extends DialogFragment {
    private AsyncHttpClient client = new AsyncHttpClient();
}

客户端正在任何方法范围之外初始化。 这到底是什么意思? CititiesDialog的每个实例是否都有单独的客户端对象? 还是这是某种静态/类变量?

最后,这是Java的规范吗? 初始化超出构造函数/方法等范围的变量...

谢谢

clientCitiesDialog的实例变量

您创建的每个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM