我想知道是否可以限制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中实现这一目标?也许某些模式或某些继承魔法?
谢谢, 斯文
更新
看到编程方面没有足够好的解决方案,也许有一些测试工具可以进行代码分析,并且可以确保没有调用任何类方法?
答案 0 :(得分:0)
如果你的课程在同一个软件包中,你可以从你的方法中删除public
修饰符(在界面和实现中),使其成为 package-private 。 (见Controlling Access to Members of a Class)
或者,如果要限制从MultiInstanceAuditingEventHandler
访问 ,则可以在运行时读取堆栈跟踪,但您必须单独在每个实现方法中执行此操作。 (这也就像作弊一样,我会劝阻这个选项。)
答案 1 :(得分:0)
另一个答案描述了“包私有”选项。 (你显然已经考虑过了。
另一种选择是在EDAEventHandler
类的中声明DBEventHandler
和MultiInstanceAuditingEventHandler
,并将其声明为private static
。