Bet*_*eto 5 java constructor design-patterns initialization
说我有以下课程:
public class FormContainer {
@EJB
private ExternalDao externalDao; // uses dependency Injection
private final OrderForm orderForm;
private final List<OrderFormContent> formContents;
public FormContainer(OrderForm orderForm) {
this.orderForm = orderForm
initializeOrderForm();
}
private void initializeOrderForm() {
formContents = externalDao.getFormContents(orderForm);
// similar for any other properties
}
// getters & setters
}
Run Code Online (Sandbox Code Playgroud)
我正在使用这个类来保存我需要通过应用程序引用的所有字段.我仍在学习良好的设计和糟糕的设计实践,所以我想知道这个糟糕的设计是否初始化orderForm的属性.
如果是这样,怎么可以改进?
没关系。
要记住的重要规则是不允许this“逃逸”,这意味着不要让实例通过匿名/内部类直接或隐式传递到另一个“进程”(以最广泛的术语定义)。
原因是你的实例在其他进程拿到的时候可能没有完全初始化,这会导致不一致和奇怪的bug。
可以从构造函数中调用私有方法来初始化类内部使用的一些数据。只需确保您的方法没有“副作用”,例如您的类的用户在调用构造函数时可能不会想到的长期方法。
如果您有这样的方法,也许您应该提取类的用户在准备好时将使用的 Initialize 方法。