Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将类本身作为其构造函数';s唯一参数_Java - Fatal编程技术网

Java 将类本身作为其构造函数';s唯一参数

Java 将类本身作为其构造函数';s唯一参数,java,Java,大家好 我在工作中用了一小部分代码。。我的同事看到了这一点,给了我一个“你不配呼吸”的表情,然后出去约30分钟冷静下来。(我是应届毕业生) 我一直在想我犯了什么可耻的错误。。它没有成功 有人能确切地解释一下为什么这样做是一种不好的做法(或愚蠢的做法) 我这样做的原因是这个类有很多参数,我不希望每次需要初始化这个对象时都要传递3行参数(使用基本参数) 并且,仅供参考,这个对象是(正如我们在工作中所称的)一个事务对象,每当我们需要传递一个实体类(它被用来代替实体类)时,它就会被初始化 我也有一个默认

大家好

我在工作中用了一小部分代码。。我的同事看到了这一点,给了我一个“你不配呼吸”的表情,然后出去约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答案的评论