我在我们的一个应用程序中看到了以下代码:
public class First()
{
private Second _second;
public First()
{
_second = new Second(this);
// Doing some other initialization stuff,
}
}
public class Second
{
public Second(First f)
{
}
}
在First()
构造函数中,我们在类First()
完全构造之前发送它的引用是不是很糟糕?我认为只有当控制逻辑离开构造器时,对象才是完全构造的。
或者这样可以吗?
发布于 2012-08-03 04:09:24
如果您遇到此模式,您可能会检查是否可以将其重构为以下内容:
public class First()
{
private Second _second;
public First()
{
_second = new Second(this);
// Doing some other initialization stuff,
}
private class Second
{
public Second(First f)
{
}
}
}
将依赖项传递到构造函数中意味着两个类之间存在一种紧密耦合,因为First必须相信Second知道自己在做什么,而不会尝试依赖于First的未初始化状态。当Second是一个私有嵌套子类(因此是一个清晰的实现细节)时,或者当它是一个内部类时,这种强耦合更合适。
发布于 2012-08-03 04:05:15
答案是,这取决于。不过,一般来说,由于潜在的后果,这将被认为是一个坏主意。
不过,更具体地说,只要Second
在构造之前没有实际使用First
中的任何内容,那么就不会有问题。如果你不能以某种方式保证这一点,你肯定会遇到问题。
发布于 2012-08-03 04:05:19
是的,有点糟糕。可以在First
完全初始化之前对它的字段做一些事情,这将导致不需要的或未定义的行为。
当你从构造函数中调用一个虚方法时,同样的事情也会发生。
https://stackoverflow.com/questions/11784878
复制相似问题