java中的约定 - 构造函数/方法之外的"new"?

Loï*_*ier 7 java new-operator

简单的问题.一个心灵的朋友写了类似于这个的代码(这只是为了解释你我的问题,它根本没有用......)

class Example{
    private int[] tab = new int[10];
    public Example() {
        for(int i = 0 ; i < 10 ; i++)
            tab[i] = (int)(Math.random()*100);
        for(int i = 0 ; i < 10 ; i++)
            System.out.println(tab[i]);
    }
    public static void main(String[] arg) {
        Example ex = new Example();
    }
}
Run Code Online (Sandbox Code Playgroud)

我告诉他他应该把new构造函数放在里面

class Example{
    private int[] tab;
    public Example() {
        tab = new int[10];
    ...
}
Run Code Online (Sandbox Code Playgroud)

当他问我为什么时,我不知道该回答什么:除了"这样做更好"之外,我没有明确的争论.我学习它的方式,您可以使用基本类型(int,double ...)初始化变量,但对于数组,您应该在构造函数中执行它.

所以:

  • 它真的更好吗?
  • 有一些很好的理由:会议,风格?
  • 是否会改变使用更少/更多内存的东西?

我不考虑元素数量可能变化的情况.它总是10

Ste*_*n C 7

  • 它真的更好吗?

不是,IMO.

  • 有一些很好的理由:惯例?风格?

当你有多个构造函数,或者初始值依赖于构造函数参数时,可能有正当理由选择一种方式而不是另一种方式; 例如

private int[] tab;

public Example(int size) {
    tab = new int[size];
    for (int i = 0; i < size; i++)
        tab[i] = (int) (Math.random() * 100);
}
Run Code Online (Sandbox Code Playgroud)

要么

private int[] tab = new int[10];

public Example(int initial) {
    for (int i = 0; i < 10; i++)
        tab[i] = initial;
}

public Example() {
    for (int i = 0; i < 10; i++)
        tab[i] = (int) (Math.random() * 100);
}
Run Code Online (Sandbox Code Playgroud)

除此之外(在您的示例中),没有关于此的一般规则.这是个人品味的问题.

  • 它会改变更少/更多使用的内存吗?

在你的例子中,它没有任何区别.一般来说,代码大小或性能可能略有不同,但不值得担心.

总之,我不认为你对你朋友的建议有合理的依据.

我学习它的方式,您可以使用基本类型(int,double ...)初始化变量,但对于数组,您应该在构造函数中执行它.

你应该忘掉这一点......或者至少认识到这只是个人偏好.