构造函数再次被调用?

发布于 2024-08-30 10:29:33 字数 1637 浏览 8 评论 0原文

我有这个构造函数;

public UmlDiagramEntity(ReportElement reportElement, int pageIndex, Controller controller) {
    super(reportElement.getX1(), reportElement.getY1(), reportElement.getX2(), reportElement.getY2());
    setLayout(null);

    this.pageIndex = pageIndex;
    this.controller = controller;
    reportElements = reportElement.getInternalReportElements();
    components = new ArrayList<AbstractEntity>();
    changedComponentIndex = -1;

    PageListener p = new PageListener();
    this.addMouseMotionListener(p);
    this.addMouseListener(p);

    setPage();
}

我在同一个类中有一个更新方法;

   @Override
    public void update(ReportElement reportElement) {
        if (changedComponentIndex == -1) {
            super.update(reportElement);
        } else {
            reportElements = reportElement.getInternalReportElements();
            if (components.size() == reportElements.size()) {
                if (!isCommitted) {
                    if (reportElement.getType() == ReportElementType.UmlRelation) {
                        if (checkInvolvementAndSet(changedComponentIndex)) {
                            anchorEntity(changedComponentIndex);
                        } else {
                            resistChanges(changedComponentIndex);
                        }
                        return;
                    }
                }
..................goes on

当我跟踪调试器的流程时,我发现当调用 update 时,在方法中的某个位置,程序进入构造函数并再次执行它(super、pageIndex 等)。为什么它会转到构造函数:DI 没有告诉它去那里。

如果你愿意的话,我可以进行更深入的分析,看看它到了构造函数的哪里。顺便说一句,changedComponentIndex 是一个静态变量。

I have this constructor;

public UmlDiagramEntity(ReportElement reportElement, int pageIndex, Controller controller) {
    super(reportElement.getX1(), reportElement.getY1(), reportElement.getX2(), reportElement.getY2());
    setLayout(null);

    this.pageIndex = pageIndex;
    this.controller = controller;
    reportElements = reportElement.getInternalReportElements();
    components = new ArrayList<AbstractEntity>();
    changedComponentIndex = -1;

    PageListener p = new PageListener();
    this.addMouseMotionListener(p);
    this.addMouseListener(p);

    setPage();
}

And I have an update method in the same class;

   @Override
    public void update(ReportElement reportElement) {
        if (changedComponentIndex == -1) {
            super.update(reportElement);
        } else {
            reportElements = reportElement.getInternalReportElements();
            if (components.size() == reportElements.size()) {
                if (!isCommitted) {
                    if (reportElement.getType() == ReportElementType.UmlRelation) {
                        if (checkInvolvementAndSet(changedComponentIndex)) {
                            anchorEntity(changedComponentIndex);
                        } else {
                            resistChanges(changedComponentIndex);
                        }
                        return;
                    }
                }
..................goes on

When I follow the flow from the debugger, I see that when update is called, somewhere in the method, the program goes into the constructor and executes it all over again (super, pageIndex, etc.). Why does it go to the constructor :D I didn't tell it to go there.

I can make a deeper analysis and see where it goes to the constructor if you want. By the way, changedComponentIndex is a static variable.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

想你的星星会说话 2024-09-06 10:29:33

我发现您更有可能看到它构造两个不同的对象。您必须提供更多信息,例如堆栈跟踪;这里你甚至没有显示正在调用的构造函数!

I would find it far more probable that you are seeing it construct two different objects. You'd have to provide more information like a stack trace; here you haven't even shown the constructor being invoked!

伪装你 2024-09-06 10:29:33

您所描述的行为几乎是不可能的。您的代码与您所显示的代码不同,或者您没有调试您认为正在调试的代码。如果没有我们可以运行的完整代码,我们只能说这些。

The behaviour you describe is pretty much impossible. Either your code is different from what you've shown or you're not debugging the code you think you're debugging. Without complete code that we can run, that's all we can say.

抠脚大汉 2024-09-06 10:29:33

您确定更新不是从构造函数内间接调用的,这会导致触发更新中的断点。

尝试在构造函数的开头和结尾设置一个断点,然后在更新中设置一个断点。当您点击第一个构造函数断点时,点击“继续”并查看接下来触发哪个断点。

Are you sure that update is not called indirectly from within the constructor, which would result in a breakpoint in update getting triggered.

Try setting a breakpoint at the start of the constructor and at the end, then one in update. When you hit the first constructor breakpoint, hit 'continue' and see which breakpoint gets triggered next.

-残月青衣踏尘吟 2024-09-06 10:29:33

这是多线程吗?是否有可能调用在另一个线程上创建的不同实例的构造函数?

Is this multi-threaded? Is it possible that the constructor for a different instance created on another thread is being called?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文