当我基于我的c++知识使用Java时,我喜欢使用以下方式初始化变量。

public class ME {
    private int i;

    public ME() {
         this.i = 100;
    }
}

一段时间后,我改变了习惯

public class ME {
    private int i = 100;

    public ME() {
    }
}

我遇到了其他人的源代码,一些使用第1公约,其他人使用第2公约。

请问你们都推荐哪个会议?为什么?


当前回答

我认为第一个方法的唯一问题是,如果您计划添加更多的构造函数。这样你就会重复代码,可维护性也会受到影响。

其他回答

我认为两者都是正确的编程方式,

但是我认为你的第一个选择在面向对象的方式中更正确,因为在构造函数中是对象创建的时候,也是变量应该初始化的时候。

我认为这是“照章办事”的惯例,但它是可以讨论的。

维基百科

首先,无论如何初始化字段,如果可能的话,使用最终限定符将确保在多线程环境中字段值的可见性。

这取决于你初始化的是什么,例如,如果涉及到检查异常,你不能只使用字段初始化。例如:

public class Foo {
    FileInputStream fis = new FileInputStream("/tmp"); // throws FileNotFoundException
}

将导致编译时错误,除非你还包含一个声明该检查异常的构造函数,或者扩展一个声明该检查异常的超类,例如:

public Foo() throws FileNotFoundException {} 

我建议在构造函数中初始化变量。这就是它们存在的原因:确保你的对象被正确构造(初始化)。

两种方法都可以,只是风格的问题,但我更喜欢用构造函数来初始化成员。

根据您的情况,这两种选择都是正确的。

一个非常简单的例子是:如果你有多个构造函数,它们都以相同的方式初始化变量(每个构造函数都是int x=2)。在声明时初始化变量以避免冗余是有意义的。

在这种情况下考虑最终变量也是有意义的。如果在声明时知道final变量的值,那么在构造函数外部初始化它是有意义的。但是,如果您希望类的用户通过构造函数初始化最终变量,请将初始化延迟到构造函数。