Java 将方法调用限制为一个类

Java 将方法调用限制为一个类,java,limit,method-call,Java,Limit,Method Call,我想知道在java中是否可以将一个方法限制为只由一个类调用 public interface IAuditingEventHandler { public void handleEvent(BaseEventType event); } public class EDAEventHandler implements IAuditingEventHandler { //should be callabe only from MultiInstanceAuditingEventHa

我想知道在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);
        }
    }
}
公共接口IAuditingEventHandler{
公共无效handleEvent(BaseEventType事件);
}
公共类EDAEventHandler实现IAuditingEventHandler{
//应仅从MultiInstanceAuditingEventHandler调用
@凌驾
公共无效handleEvent(BaseEventType事件)。。。
}
公共类DBEventHandler实现IAuditingEventHandler{
//应仅从MultiInstanceAuditingEventHandler调用
@凌驾
公共无效handleEvent(BaseEventType事件)。。。
}
公共类MultiInstanceAuditingEventHandler实现IAAuditingEventHandler{
私人最终名单;
公共多实例AuditingEventHandler(列出EventHandler){
this.eventHandlers=eventHandlers;
}
//到处都可以打电话
@凌驾
public void handleEvent(BaseEventType事件){
对于(IAuditingEventHandler eventHandler:eventHandlers){
eventHandler.handleEvent(事件);
}
}
}
如您所见,我有两个类,其方法为handleEvent,只能从一个特定类MultiInstanceAuditingEventHandler调用。代码的其余部分应该只能调用一个特定的类MultiInstanceAuditingEventHandler

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

有没有一种方法可以在Java中实现这一点?也许是某种模式或某种遗传魔法

谢谢, 斯文

更新


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

如果您的类在同一个包中,您可以从方法中删除
public
修饰符(在接口和实现中)使其包私有化。(见附件)

或者,如果您想将访问权限限制为仅从
MultiInstanceAuditingEventHandler
,则可以在运行时读取堆栈跟踪,但必须在每个实现方法中单独执行。(这感觉像是作弊,我不鼓励这种选择。)

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


另一个选项是在
MultiInstanceAuditingEventHandler
类中声明
EDAEventHandler
DBEventHandler
,并将它们声明为
private static

您不能将它们放在同一个包中,只允许对handleEvent方法进行包级访问吗?如果不能预先声明,会发生什么这是不是?你可以在运行时检查,但是一般来说,这样做不值得额外的复杂性。我们想到的唯一解决方案是包保护。缺点是仍然可以从包内调用方法。但是,可以为它创建一个包。我们要做的是保留其他方法我们团队中的ER避免了犯错误,只调用单个实现,而不是该接口的每个可用实现。