Java中构造函数中的对象转义总是一个问题吗



出于线程安全的原因,它是有争议的:

在施工过程中,不要让此引用逃逸。

但是,这总是一个问题吗?应该通过使用newInstance()方法来避免吗?在我的模型类中,我有一个TableModel,它应该在模型类中实例化,但它也需要对模型类的引用:

public class MainModel {
   TableModel tableMode;
   public MainModel() {
      tableModel = new MyTableModel(this);
   }
}

如果构造函数没有立即使用它,那么它是安全的还是应该以任何方式避免?

如果MyTableModel中没有任何东西会在其他线程等中执行任何操作,或者将变量复制到其他共享数据,例如静态变量,那么它是安全的。

当然,如果MyTableModel开始在其构造函数内的MainModel引用上调用方法,那么它将在尚未完全初始化的对象上调用这些方法,这可能会导致问题,但这与线程无关。

不久前,我在博客上写了更多关于这一点的文章。

不,我不认为这总是个问题。在我看来,一个好的类是这样设计的,即构造函数将其所做的活动限制在其依赖项上,将其行为仅限于初始化。如果是这种情况,那么this仅仅因为泄露给了另一个构造函数而泄露给另一个线程将是非常令人惊讶的。

唯一不允许泄露对this的引用的时间是在调用超级构造函数之前。换句话说,您不能将参数传递给依赖于this的超级构造函数,无论是因为您调用了实例方法还是使用this构造了一些东西。

我认为更好的问题可能是为什么MyTableModel需要查看MainModel的实例?双向可见性通常是某种有害耦合的标志。

最佳实践不是纠正错误,而是最不可能引入错误、令人困惑或难以维护的模式。我看到了一些难度极高的代码,它们运行得很好。

例如,我记得一个名为c的类,它完全写在一行上以节省空间(没有换行),只使用单字符变量/字段,并且有一到两个字符的方法。这并不是故意混淆的,开发人员认为这是最有效的。只要你不需要理解或改变它,这个类就可以很好地工作。

相关内容

最新更新