是否可以将参数传递给Java构造函数方法?如果是这样,这是一个好习惯吗?

时间:2016-01-28 17:33:10

标签: java

我正在阅读Bruce Eckel撰写的“Thinking in Java”一书,我遇到了一个代码片段,我或多或少地理解,但想要修改。实际上,代码的目的是表明类静态变量只被实例化一次,并且在调用所述类的构造函数方法之前。

以下是关于repl.it (我添加了评论)https://repl.it/Bhct/6的图书代码的链接,我将在下面发布它及其结果:

class Main {
    public static void main(String[] args) {
        System.out.println("Inside main()");
        Cups.c1.f(99);
    }

    // Want to initialize a counter int here
    // static int counter = 1;

    // Want to pass counter to Cups constructor here:
    // static Cups x = new Cups(counter);
    static Cups x = new Cups();
    // counter++;
    // static Cups x = new Cups(counter);
    static Cups y = new Cups();
    // counter++;
    // static Cups x = new Cups(counter);
    static Cups z = new Cups();
}

class Cup {
    Cup(int marker) {
        System.out.println("Cup("+ marker +")");
    }
    void f(int marker) {
        System.out.println("f(" + marker + ")");
    }
}

class Cups {
    int counter = 1;
    static Cup c1;
    static Cup c2;
    static {
        c1 = new Cup(1);
        c2 = new Cup(2);
    }
    // Want to pass an arg to Cups() like this: 
    // Cups(int counter) {
    //     System.out.println("Cups() constructor #" + counter);
    // }
    Cups() {
        System.out.println("Cups()");
    }
}

结果

Cup(1)
Cup(2)
Cups()
Cups()
Cups()
Inside main()
f(99)

我想要做的是编辑Cups()构造函数的日志以包含一个表示它们被调用顺序的计数器,即:

Cup(1)
Cup(2)
Cups() 1
Cups() 2
Cups() 3
Inside main()
f(99)

请参阅我的评论,我认为可以这样做。在main中定义静态变量并通过调用counter++递增它不起作用,因为期望“”。但是,我以为我早先将计数器声明为int?

我尝试过这方面的一些变化,比如将增量作为主要内部和外部的方法,但我没有运气。

我在这里缺少什么主要的Java概念?

我提前为这个问题的措辞道歉。不完全确定如何提出这个问题。

1 个答案:

答案 0 :(得分:1)

你的方法是正确的,但你必须在杯子里让你的反击静止:

class Cups {
    static int counter = 1;
    static Cup c1;
    static Cup c2;
    static {
      c1 = new Cup(1);
      c2 = new Cup(2);
    }

    Cups() {
        System.out.println("Cups() constructor #" + counter);
        counter++;
    }
}

原因是所有Cups实例共用同一个计数器。如果他们有每个一个单独的计数器,那么对于每个Cups实例,它将是1。通过使计数器静态,所有实例都会增加相同的变量。

这是更快的解决方案。这是另一种方式,需要对代码进行更多更改,但实际上更类似于您的方法(如您所愿):

class Main {
    public static void main(String[] args) {
        System.out.println("Inside main()");
        Cups.c1.f(99);
    }

    static int counter = 1;

    // Want to pass counter to Cups constructor here:
    static Cups x = new Cups(counter);

    // Want to increment that counter here
    static Cups y = new Cups(counter);

    // Want to increment that counter here
    static Cups z = new Cups(counter);

}

Cups(int counter) {
    System.out.println("Cups() constructor #" + counter);
    Main.counter++;
 }

您需要Main.counter引用计数器。