在构造函数上使用init()方法是一个糟糕的做法吗



这些天我读到了关于java的良好实践我的世界已经支离破碎,因为他们说在我知道,构造函数可能是一种糟糕的做法。。公共方法可以被重写,但我的情况有点不同,所以请帮我忘掉它。示例:

public class MLabel extends JLabel {
private Color color;
public MLabel(String txt, Color color, int align) {
super(txt, null, align);
this.color = color;
init(); 
}
private void init() {
setFont(new Font(Font.SERIF, Font.BOLD, 16));
setForeground(color);
}
}

我已经读过这个答案,但仍然找不到解决方案,认为工厂会为这个简单的任务制作一个非常健壮的代码,我只想"配置"JLabel以便于使用

谢谢大家,学习良好的编程实践有点困难,因为问题不会出现在错误中,而是在如何制作方面,我已经投票支持所有优秀的答案,我将至少暂时更改工厂的inits((。。谢谢

构造函数不得直接或间接调用可重写方法。如果违反此规则,将导致程序失败。超类构造函数在子类构造函数之前运行,因此子类中的重写方法将在子类构造器运行之前被调用。如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期运行。具体来说,这里有一个类违反了这个规则:

来源:高效Java,第二版,第89页。

您可以阅读整个讨论,了解为什么不在构造函数中调用init方法。使用生命周期挂钩是个好主意,例如spring等框架提供了这样的功能。

最好简化构造函数,方法是最大限度地进行简单的字段初始化,并将复杂的初始化(如init(分离到另一个Factory专用类中。

在java中使用"精益构造函数"是一种很好的做法。尤其是在spring这样的框架中。在构造函数中,如果有一个init,它很有可能被用来错误地使用。比如说,有一个通过init到数据库的连接。这是一个潜在的失败点。避免这种情况是一个很好的做法。最好是能够首先创建bean或对象,然后在第一次使用对象时,如果存在错误的配置或init,则使其失败。

在您的情况下,如果创建对象Font失败怎么办?在这种情况下,您甚至没有创建MLabel。最好避免这种情况。

相关内容

最新更新