public class Foo{
private String a;
private int b;
public Foo(Foo foo){
this.a = foo.a;
this.b = foo.b;
}
}
大家好。
我在工作中做了一小部分代码。我的同事看到了这个并给了我“你不应该呼吸”的样子,然后出去约30分钟冷静下来。 (我是一名新毕业生)
我一直试图找出我犯下的可耻错误。它没有成功。
请有人解释为什么这是一个不好的做法(或愚蠢)?
我这样做的原因是该类有很多参数,我不想每次需要初始化这个对象时都要传递3行参数(使用原始参数)。
而且,FYI这个对象是(正如我们在工作中所称)一个事务对象,只要我们需要传递一个实体类(它使用而不是实体类)就会初始化它。
我也有默认的构造函数。
谢谢!
答案 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);