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

时间:2010-09-30 11:54:30

标签: 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();
    }
}

我告诉他应该将new放在构造函数

class Example{
    private int[] tab;
    public Example() {
        tab = new int[10];
    ...
}

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

所以:

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

我不考虑元素数量可能变化的情况。它总是十分之一

5 个答案:

答案 0 :(得分:7)

  
      
  • 真的更好吗?
  •   

不是,IMO。

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

当你有多个构造函数,或者初始值依赖于构造函数参数时,选择一种方式可能有正当理由; e.g。

private int[] tab;

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

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);
}

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

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

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

简而言之,我认为你对朋友的建议并不合理。

  

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

你应该忘记......或者至少认识到这只是个人偏好。

答案 1 :(得分:4)

实际上我更喜欢使用外部方法。如果他添加了一个构造函数并且有

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

public Example() { }

public Example(int somethVar) { }

然后两个构造函数都有一个foo数组可供使用。请参阅this article,因为Java编译器非常智能,可以将这些内容复制到构造函数中,所以它确实没有更好。

答案 2 :(得分:3)

我不知道一种方法或另一种方法的任何功能/性能优势。但是有些想法为什么立即初始化变量会更好。

  1. 如果您有三个不同的构造函数,那么您不希望在每个构造函数中添加new int[10];,对吗?
  2. 可读性。当我看到代码中使用的变量时,我可以在我的IDE中执行'ctrl-click'并查看它的类型和值。我不必四处搜索它初始化的地方。

答案 3 :(得分:3)

这可能是一个愚蠢的问题,因此被投票,但是......为什么你的朋友不使用初始化块,你知道,初始化?

我完全理解为什么他不想把它放在构造函数中,因为它可能不是 构造函数,并且在使用no-arg时无休止地重复每个构造函数中的初始化代码显然很糟糕构造函数和依赖于this()的自动调用可能令人不安。

因此...

这是我自己使用的代码:

class Example{
    private int[] tab;

    { 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();
    }
}

我甚至大致使用那个结构:声明我的私有成员,放入初始化块,声明我的构造函数,声明我的其余方法。

答案 4 :(得分:1)

我喜欢在构造函数中初始化我的非静态实例变量,

这样做可以让其他人更容易识别构造函数运行时遵循的策略。

每个新对象都有自己的tab实例,因此在您的示例中,类是否保持不变并不重要。

我唯一使用构造函数的时候是需要传递适用于整个对象的参数而不是特定方法,例如:

public class Authenticate{
    private String usrname;
    private String password;
    public Authenticate(String usernameParam,String passwordParam){
        this.usrname = usernameParam;
        this.password = passwordParam;
    }

    public void login(){
        //TODO put some code here to authenticate against some server using some technology.
    }

    public String getDepartment(){
        //Get the department where the username and password variable would be necessary if
        //login hasn't been called.
    }
}