Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在构造函数上使用init()方法是错误的做法吗?_Java_Constructor_Initialization - Fatal编程技术网

Java 在构造函数上使用init()方法是错误的做法吗?

Java 在构造函数上使用init()方法是错误的做法吗?,java,constructor,initialization,Java,Constructor,Initialization,这些天,我在读关于java的好实践,而且在某些方面 我的世界已经支离破碎,因为他们说调用“init”方法 我知道,构造函数可能是个糟糕的做法。。可以重写公共方法, 但我的情况有点不同,所以请帮我想想。例如: public class MLabel extends JLabel { private Color color; public MLabel(String txt, Color color, int align) { super(txt, nul

这些天,我在读关于java的好实践,而且在某些方面 我的世界已经支离破碎,因为他们说调用“init”方法 我知道,构造函数可能是个糟糕的做法。。可以重写公共方法, 但我的情况有点不同,所以请帮我想想。例如:

    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之类的框架提供了这样的特性

最好通过在max处进行简单的字段初始化,并在另一个专用于此目的的工厂类中分离像init()这样的复杂初始化来简化构造函数

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


在您的情况下,如果在创建对象字体时出现故障怎么办?在这种情况下,您甚至没有创建MLabel。最好避免这种情况。

您不能在构造函数之外初始化
final
字段。您从哪里读到的,他们的理由是什么?因为代码的可重用性。。init(),setup()可能是一个糟糕的做法,我一直在寻找另一种方法来配置类“程序失败可能会导致”,而不是“威尔”。是的,你应该告诉这本书的作者。)既然你善意地提供了消息来源,我查过了。事实上,他们是这么说的(在第89页,而不是第90页)。然而,来源有时可能是错误的。每个人都可以创建这样的可重写方法,但是如果您负责任地使用它,那么程序没有理由会导致失败。只有当你不负责任地超越它时,它才会发生。我怎样才能避免这种情况?还有其他(好的)方法吗?除此之外,如果在构造函数中放入init方法,可能会导致代码重复。例如,您有一个无参数构造函数,从该构造函数调用该方法。然后,您决定添加一个带有args的新构造函数,然后要么您的init方法将不会被调用,要么您必须将该方法复制到所有构造函数,这是一种糟糕的做法。您的init方法可能是私有的,不可过度使用,但您可以调用另一个可以重写的方法,随着项目的发展,这很难限制。最好是对Spring这样的框架进行初始化。我不想使用工厂,因为代码总是一样的,只是制作一个个性化的标签,我会在整个程序中使用它(这是一个非常小的程序)你说的对,但是如何制作呢?JLabel的基础不会改变,我需要使其易于使用:/