首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >避免Java中的“instanceof”

避免Java中的“instanceof”
EN

Stack Overflow用户
提问于 2011-05-28 05:22:35
回答 7查看 10.1K关注 0票数 63

我有以下(可能是常见的)问题,它目前绝对让我困惑不解:

有两个生成的事件对象,它们扩展了抽象类Event,我想将它们划分为会话Beans,例如

public void divideEvent(Event event) {
    if (event instanceof DocumentEvent) {
        documentGenerator.gerenateDocument(event);
    } else if (event instanceof MailEvent) {
        deliveryManager.deliverMail(event);
        ...
    }
    ...

}

但是将来可能会有两种以上的事件类型,所以if-else会很长,而且可能无法读取。此外,我认为instanceof在这种情况下并不是真正的“最佳实践”。

我可以向Event类型添加一个抽象方法,并让它们自己分开,但然后我必须在每个实体中注入特定的会话Beans。

对于这个问题,有没有什么“漂亮”的解决方案呢?

谢谢你的帮助!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-05-28 05:28:46

最简单的方法是让事件提供一个您可以调用的方法,以便事件知道要做什么。

interface Event {
    public void onEvent(Context context);
}

class DocumentEvent implements Event {
    public void onEvent(Context context) {
         context.getDocumentGenerator().gerenateDocument(this);
    }
}

class MailEvent implements Event {
    public void onEvent(Context context) {
         context.getDeliveryManager().deliverMail(event);
    }
}


class Context {
    public void divideEvent(Event event) {
        event.onEvent(this);
    }
}
票数 54
EN

Stack Overflow用户

发布于 2011-05-28 05:26:02

每个事件都有一个函数,比如do。每个子类覆盖都会执行(:P)相应的操作。动态分派会在之后执行其他所有操作。您所需要做的就是调用event.do()

票数 8
EN

Stack Overflow用户

发布于 2011-05-28 05:46:56

我没有评论的权利,我也不知道确切的答案。但是,只有我还是这里的一些人建议使用重载(在编译时发生,因此只会生成编译错误)来解决这个问题?

这只是一个例子。如您所见,它将不会编译。

package com.stackoverflow;

public class Test {
    static abstract class Event {}
    static class MailEvent extends Event {}
    static class DocEvent extends Event {}

    static class Dispatcher {
        void dispatchEvent(DocEvent e) {
            System.out.println("A");
        }

        void dispatchEvent(MailEvent e) {
            System.out.println("B");
        }
    }

    public static void main(String[] args) {
        Dispatcher d = new Dispatcher();
        Event e = new DocEvent();

        d.dispatchEvent(e);
    }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6157835

复制
相关文章

相似问题

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