This question already has answers here:
Is it violation of Clean Code to call init method in constructor like this
(6个答案)
2年前关闭。
这些天,我在阅读有关Java的一些实用知识,在某些时候
我的世界变得支离破碎,因为他们说在
我知道,构造函数可能是一个坏习惯。.公共方法可以被覆盖,
但就我而言有点不同,所以请帮我一下。例:
我已经阅读了该答案,但仍然找不到解决方案,认为工厂将为该简单任务编写更健壮的代码,我只想“配置” JLabel以方便使用
谢谢大家,对编程的良好实践进行研究有点困难,因为这些问题不会出现错误,但是会出现错误,我会全力以赴寻求最佳答案,并且我将inits()更改为至少现在工厂..谢谢
(6个答案)
2年前关闭。
这些天,我在阅读有关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这样的框架提供了这些功能。