将类本身作为构造函数的唯一参数

时间:2014-09-22 10:44:47

标签: java

public class Foo{
    private String a;
    private int b;

    public Foo(Foo foo){
        this.a = foo.a;
        this.b = foo.b;
    }
}

大家好。

我在工作中做了一小部分代码。我的同事看到了这个并给了我“你不应该呼吸”的样子,然后出去约30分钟冷静下来。 (我是一名新毕业生)

我一直试图找出我犯下的可耻错误。它没有成功。

请有人解释为什么这是一个不好的做法(或愚蠢)?

我这样做的原因是该类有很多参数,我不想每次需要初始化这个对象时都要传递3行参数(使用原始参数)。

而且,FYI这个对象是(正如我们在工作中所称)一个事务对象,只要我们需要传递一个实体类(它使用而不是实体类)就会初始化它。

我也有默认的构造函数。

谢谢!

4 个答案:

答案 0 :(得分:5)

您的代码没有任何问题。实际上你所做的有一个名字:copy constructor 并且它是另一个对象的复制的非常方便的方法。 (假设除了这个构造函数之外你还有其他方法可以创建它的实例)

答案 1 :(得分:2)

您只有1个构造函数,因此为了创建类Foo的对象,您需要将Foo传递给构造函数,并且为了创建Foo,您将需要需要另一个Foo,它会一直持续下去。如果例如,代码可以更有意义。你将在类中有一个默认的构造函数,然后是构造函数

public Foo(Foo foo){
    this.a = foo.a;
    this.b = foo.b;
}

将更像

中的复制构造函数

答案 2 :(得分:1)

这是非密码。您需要类的实例来创建实例...您想如何创建此对象的第一个实例?

答案 3 :(得分:1)

如果要使用new关键字创建实例,构造函数将获取调用。所有类都有一个默认构造函数,类似于classname(){}

在您的示例中,您有一个单独的构造函数。因此,您的类不再存在默认构造函数。 你现在唯一的构造函数是

public Foo(Foo foo){}

根据你的来源,你必须传递一个Foo实例来创建一个新的Foo类实例。 所以你可以尝试

Foo fooObj = new Foo(new Foo(new Foo(.......))

正如你所看到的,这永远不会结束。

您可以将null作为参数传递给构造函数

Foo fooObj = new Foo(null)

但是由于您使用引用Foo对象的实例变量来启动新Foo对象的值,因此它也不起作用。

您应该做的是将默认构造函数添加到您的类中。

public class Foo{
    private String a;
    private int b;

    public Foo(){}

    public Foo(Foo foo){
        this.a = foo.a;
        this.b = foo.b;
    }
}

然后您可以按如下方式创建Foo类的实例

Foo f1 = new Foo();
f1.setA("ABC"); // create getters and setters
f1.setB(12);

Foo f2 = new Foo(f1);