繁体   English   中英

这两种方法在Java中初始化字段有什么区别?

[英]what's the difference between those two ways to initialize fields in Java?

  1. 使用字段声明将值同时分配给字段
  2. 为构造函数中的字段赋值?

这两种初始化Java字段的方法有什么区别?

不多! 主要区别在于,如果在声明点分配它,它将适用于所有构造函数。 也就是说,你无法忘记将初始化添加到任何未来的构造函数中。

看一下官方的Initializing Fields路径。

值得注意的是,如果在声明处初始化字段,则会构造函数开始执行之前发生。

根据经验,我通常会在声明中初始化“死的简单”字段(当毫无疑问应该是初始值时)。 这“清理”例如

class SomeClass {

    List<Integer> currentNumbers = new ArrayList<Integer>();
    int counter = 0;

    // ...
}

虽然我似乎有可能在不同的构造函数中想要不同的行为,但我将它留给构造函数。

在这两种情况下,只会在超类构造函数执行分配值。

对于第一个选项,您必须能够在不引用任何构造函数参数的情况下确定值。

对于第二个选项,您需要在每个构造函数重载中分配值。

基本上我倾向于支持第二个选项,当值取决于构造函数参数(通常这是我希望它依赖的所有参数)和第一个选项,当值对于任何新初始化的实例都是相同的。 倾向于不混合和匹配单个字段,使用与声明的初始化,并在一些构造函数重载分配给它,但即使这可能是有用的偶然。 (想象一下,对于大多数构造函数,大小为0的集合,但有一个构造函数,它接受一组初始值。)

虽然你可以在变量声明中引用其他实例成员,但我不想 - 当你的对象只是部分初始化时调用实例方法是脆弱的,并且引用其他变量依赖于变量排序,这对我来说感觉很难看。

(1)是(2)的语法糖(静态字段除外)

它完全相同,只是在对象实例化生命周期的不同时间。 在这里查看更多信息。

在第一种情况下,将在初始化类时创建字段并直接分配您为其声明的值,而在第二种情况下,将创建字段并分配默认值(如果是对象则为null,如果为对象则为0)一个int等,然后在执行构造函数时分配正确的值。 当然,实际上通常没有太大区别,因为两种情况下的结果都是相同的:当构造函数返回后创建此类的实例时,字段被正确初始化。 我猜第一种方法会更有用,如果你有多个构造函数和一个字段应该具有相同的值,无论调用哪个构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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