首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >构造函数中可重写的方法调用有什么问题?

构造函数中可重写的方法调用有什么问题?
EN

Stack Overflow用户
提问于 2010-08-04 17:41:44
回答 3查看 132.1K关注 0票数 390

我有一个Wicket页面类,它根据抽象方法的结果设置页面标题。

代码语言:javascript
复制
public abstract class BasicPage extends WebPage {

    public BasicPage() {
        add(new Label("title", getTitle()));
    }

    protected abstract String getTitle();

}

NetBeans警告我“构造函数中可重写的方法调用”,但它应该有什么问题?我能想到的唯一替代方法是将其他抽象方法的结果传递给子类中的超级构造函数。但这可能很难理解,因为有很多参数。

EN

回答 3

Stack Overflow用户

发布于 2010-08-04 17:49:05

在构造函数中调用可覆盖方法会允许子类破坏代码,因此您不能保证它会继续工作。这就是为什么你会得到一个警告。

在您的示例中,如果一个子类覆盖了getTitle()并返回null,会发生什么?

要“修复”这个问题,你可以使用factory method而不是构造函数,这是对象实例化的常见模式。

票数 11
EN

Stack Overflow用户

发布于 2010-08-04 17:44:41

如果在构造函数中调用子类覆盖的方法,这意味着如果在构造函数和方法之间逻辑上划分初始化,则不太可能引用尚不存在的变量。

看一下这个示例链接http://www.javapractices.com/topic/TopicAction.do?Id=215

票数 4
EN

Stack Overflow用户

发布于 2016-12-09 19:18:49

我想对于Wicket,最好在onInitialize()中调用add方法(参见components lifecycle):

代码语言:javascript
复制
public abstract class BasicPage extends WebPage {

    public BasicPage() {
    }

    @Override
    public void onInitialize() {
        add(new Label("title", getTitle()));
    }

    protected abstract String getTitle();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3404301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档