限制方法调用一个类

时间:2014-09-09 13:33:46

标签: java limit method-call

我想知道是否可以限制java中只有一个类调用的方法。

public interface IAuditingEventHandler {
    public void handleEvent(BaseEventType event);
}

public class EDAEventHandler implements IAuditingEventHandler {
    //should be callabe only from MultiInstanceAuditingEventHandler
    @Override
    public void handleEvent(BaseEventType event)...
}


public class DBEventHandler implements IAuditingEventHandler {
    //should be callabe only from MultiInstanceAuditingEventHandler
    @Override
    public void handleEvent(BaseEventType event)...
}

public class MultiInstanceAuditingEventHandler implements IAuditingEventHandler {

    private final List<IAuditingEventHandler> eventHandlers;

    public MultiInstanceAuditingEventHandler(List<IAuditingEventHandler> eventHandlers) {
        this.eventHandlers = eventHandlers;
    }

    // can be called from everywhere
    @Override
    public void handleEvent(BaseEventType event) {
        for (IAuditingEventHandler eventHandler : eventHandlers) {
                eventHandler.handleEvent(event);
        }
    }
}

正如您所看到的,我有两个带有handleEvent方法的类,只能从一个特定的类MultiInstanceAuditingEventHandler中调用它。其余的代码应该只能调用一个特定的类MultiInstanceAuditingEventHandler。

这样做的目的是让代理知道应该调用哪些实例,并且该代码的每个用户都必须调用该代理。

有没有办法在Java中实现这一目标?也许某些模式或某些继承魔法?

谢谢, 斯文

更新

看到编程方面没有足够好的解决方案,也许有一些测试工具可以进行代码分析,并且可以确保没有调用任何类方法?

2 个答案:

答案 0 :(得分:0)

如果你的课程在同一个软件包中,你可以从你的方法中删除public修饰符(在界面和实现中),使其成为 package-private 。 (见Controlling Access to Members of a Class

或者,如果要限制从MultiInstanceAuditingEventHandler访问 ,则可以在运行时读取堆栈跟踪,但您必须单独在每个实现方法中执行此操作。 (这也就像作弊一样,我会劝阻这个选项。)

答案 1 :(得分:0)

另一个答案描述了“包私有”选项。 (你显然已经考虑过了。

另一种选择是在EDAEventHandler类的中声明DBEventHandlerMultiInstanceAuditingEventHandler ,并将其声明为private static