This question already has answers here:
Is it violation of Clean Code to call init method in constructor like this
                            
                                (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这样的框架提供了这些功能。

07-24 09:49
查看更多