Java 将类本身作为其构造函数';s唯一参数
大家好 我在工作中用了一小部分代码。。我的同事看到了这一点,给了我一个“你不配呼吸”的表情,然后出去约30分钟冷静下来。(我是应届毕业生) 我一直在想我犯了什么可耻的错误。。它没有成功 有人能确切地解释一下为什么这样做是一种不好的做法(或愚蠢的做法) 我这样做的原因是这个类有很多参数,我不希望每次需要初始化这个对象时都要传递3行参数(使用基本参数) 并且,仅供参考,这个对象是(正如我们在工作中所称的)一个事务对象,每当我们需要传递一个实体类(它被用来代替实体类)时,它就会被初始化 我也有一个默认构造函数Java 将类本身作为其构造函数';s唯一参数,java,Java,大家好 我在工作中用了一小部分代码。。我的同事看到了这一点,给了我一个“你不配呼吸”的表情,然后出去约30分钟冷静下来。(我是应届毕业生) 我一直在想我犯了什么可耻的错误。。它没有成功 有人能确切地解释一下为什么这样做是一种不好的做法(或愚蠢的做法) 我这样做的原因是这个类有很多参数,我不希望每次需要初始化这个对象时都要传递3行参数(使用基本参数) 并且,仅供参考,这个对象是(正如我们在工作中所称的)一个事务对象,每当我们需要传递一个实体类(它被用来代替实体类)时,它就会被初始化 我也有一个默认
谢谢 您只有一个构造函数,因此为了创建类
Foo
的对象,您需要向构造函数传递一个Foo
,为了创建该Foo
,您将需要另一个Foo
,并且它将继续下去。例如,如果您在类中有一个默认构造函数,然后在类中有一个构造函数,那么代码就更有意义了
public class Foo{
private String a;
private int b;
public Foo(Foo foo){
this.a = foo.a;
this.b = foo.b;
}
}
Foo fooObj = new Foo(new Foo(new Foo(.......))
在中,它将更像一个复制构造函数。您的代码没有任何问题。实际上,你所做的事有一个名字:
这是一种非常方便的方法来复制另一个对象。(假设除了这个构造函数之外,您还有其他方法来创建它的实例)当您想使用new关键字创建实例时,构造函数会得到调用。所有类都有一个默认构造函数,类似于
classname(){}
在您的示例中,您有一个单独的构造函数。因此,类的默认构造函数不再存在。
您现在拥有的唯一构造函数是
public Foo(Foo foo){
this.a = foo.a;
this.b = foo.b;
}
根据您的源代码,您必须传递一个Foo实例来创建一个新的Foo类实例。
所以你可以试试
public Foo(Foo foo){}
正如你所看到的,这永远不会结束
可以将null作为参数传递给构造函数
public class Foo{
private String a;
private int b;
public Foo(Foo foo){
this.a = foo.a;
this.b = foo.b;
}
}
Foo fooObj = new Foo(new Foo(new Foo(.......))
但是,由于您使用引用Foo对象的实例变量来初始化新Foo对象的值,因此它也不会工作
您应该做的是将默认构造函数添加到类中
Foo fooObj = new Foo(null)
然后您可以创建Foo类的实例,如下所示
public class Foo{
private String a;
private int b;
public Foo(){}
public Foo(Foo foo){
this.a = foo.a;
this.b = foo.b;
}
}
它被称为复制构造函数,我看不出它有什么固有的可耻之处;这比依靠克隆要好得多;您将如何使用此构造函数
newfoo(newfoo(newfoo(…)))
?您至少需要一个默认构造函数或工厂方法或类似的东西。正如guido所说,如果你想克隆一个类本身的构造函数是非常有用的?这提示了一些我想你没有寻找的答案(例如,and.)@will,是的,我忘了放默认构造函数,但我在实际代码中有一个默认构造函数。我没有编辑我的问题,因为有些答案也需要编辑。我也有一个默认构造函数。。很抱歉没有提及。非常感谢你的回答。。我只是错过了合适的歌手。。现在我搜索了Java的复制构造函数,我找到了这个链接,我认为这是创建复制构造函数的最好方法。你怎么认为?他的代码可能没有问题。例外情况是,当原始构造函数除了初始化字段外还执行其他操作时:当使用这样一个副本构造函数时,他可能会错过初始化的一部分。你所说的有道理。。我没有提到默认构造函数是不好的,因为我在实际代码中确实有一个默认构造函数。请阅读我对@user1427708答案的评论