Использовать интерфейсы.Отношения B с A возможны только через интерфейс, который B определяет и реализует.
Таким образом, с точки зрения B, он даже не импортирует A и не имеет доступа к определению A во время компиляции.
Отредактировано в ответ на вопрос.
Я полагаю, у вас есть класс C
ранее существовавший, неизменный вами, код в некотором пакете xy;
Class CEvent {
// some event definition
};
Class C {
public void callWhenitHappens(CEvent theEvent) {
// do something
}
}
--- код, который вы пишете ---
package p.q;
public Class A implements BEventInterface {
public void bEventHappened( BEvent theBEvent ){
// make a C event
myC.callWhenitHappens(theCEvent);
}
}
И вы обеспокоены тем, что любой , даже включая C, может вызвать этот метод bEventHappened ().
Мне кажется, что вы обеспокоены маловероятной проблемой.Зачем кому-то мешать создать объект А и делать это?Однако есть несколько возможностей:
1).Если A и B находятся в одном пакете, не делайте A и его метод общедоступным.Их должен видеть только B, поэтому в области действия пакета это будет работать.
2).Анонимный внутренний класс.Обратите внимание, что класс A ia не имеет открытых методов, поэтому C не может его использовать, и, тем не менее, B имеет открытые методы для анонимного внутреннего класса, который он может использовать.
package p.q;
import p.q.B.BEvent;
import x.y.z.C.CEvent;
import x.y.z.C;
public class A {
// anonymous class implementing required interface
private BListener myFacade = new BListener(){
@Override
public void listen(BEvent event) {
bEventHappened(event);
}
};
private B myB;
private C myC;
A() {
myC = new C();
myB = new B();
myB.registerListener(myFacade);
}
private void bEventHappened( BEvent theBEvent ){
myC.callWhenitHappens(myC.new CEvent() );
}
}
Классы B и C выглядят следующим образом:
package p.q;
public class B {
public class BEvent {
public String what;
}
private BListener myListener;
private void fireEvent(){
myListener.listen(new BEvent());
}
public void registerListener(BListener listener){
myListener = listener;
}
}
и
package x.y.z;
public class C {
public class CEvent {
public String what;
}
public void callWhenitHappens(CEvent event){
//e3c
}
}