代码之家  ›  专栏  ›  技术社区  ›  Loïc Février

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

  •  6
  • Loïc Février  · 技术社区  · 14 年前

    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…)初始化变量,但是对于数组,应该在构造函数中进行初始化。

    所以:

    • 有什么好的理由:传统,风格?

    我不考虑元素的数目可以变化的情况。永远是10

    5 回复  |  直到 10 年前
        1
  •  7
  •   Stephen C    14 年前

    不是真的,我。

    • 有什么好的理由:惯例?风格?

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

    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…)初始化变量,但是对于数组,应该在构造函数中进行初始化。

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

        2
  •  4
  •   Anon    14 年前

    private int[] foo = new int[10];
    
    public Example() { }
    
    public Example(int somethVar) { }
    

    然后两个构造函数都有一个foo数组可以使用。看到了吗 this article

        3
  •  3
  •   Nikita Rybak    14 年前

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

    1. 如果你有三个不同的构造函数,你不会想把 new int[10]; 每种都有,对吧?
        4
  •  3
  •   JUST MY correct OPINION    14 年前

    这可能是一个愚蠢的问题,因此被否决,但。。。为什么你的朋友不用初始化块来初始化?

    我完全理解他为什么不想把它放到构造函数中,因为它可能不是 这个 当使用无参数构造函数并依赖于对的自动调用时,在每个构造函数中无休止地重复初始化代码显然是不好的 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();
        }
    }
    

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

        5
  •  1
  •   Koekiebox    14 年前

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

    每一个新物体都有它自己的 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.
        }
    }