一个对象可以知道从哪个对象调用它的方法?

时间:2010-03-06 19:08:11

标签: java oop class methods

在Moritz Haarmann的博客中,我找到了example of usage of Bonjour by Java。这是从那里取得的代码:

public class ServiceAnnouncer implements IServiceAnnouncer, RegisterListener {
    private DNSSDRegistration serviceRecord;
    private boolean registered;

    public boolean isRegistered(){
        return registered;
    }

    public void registerService()  {
        try {
            serviceRecord = DNSSD.register(0,0,null,"_killerapp._tcp", null,null,1234,null,this);
        } catch (DNSSDException e) {
            // error handling here
        }
    }

    public void unregisterService(){
        serviceRecord.stop();
                registered = false;
    }

    public void serviceRegistered(DNSSDRegistration registration, int flags,String serviceName, String regType, String domain){
        registered = true;
    }

    public void operationFailed(DNSSDService registration, int error){
        // do error handling here if you want to.
    }
}

我对“serviceRegistered”方法有疑问。据我所知,它是在服务注册期间(或之后)调用的(它将变量“registered”设置为等于“true”)。但我不清楚的是它究竟是如何调用的。因为服务是通过方法“registerService”注册的。此方法又称为“DNSSD.register”。而且,据我所知,“DNSSD.register”将调用“ServiceAnnouncer”类的“serviceRegister”方法。但是“DNSSD.register”如何知道它需要调用“ServiceAnnouncer”类的方法? “DNSSD.register”能否知道它是从特定类调用的(在本例中为“ServiceAnnouncer”类)?

2 个答案:

答案 0 :(得分:4)

ServiceAnnouncer已将自身作为DNSSD.register()方法的最后一个参数传递,而RegisterListener方法显然期望DNSSD的任何实例。这样ServiceAnnouncer可以直接处理{{1}}实例。

答案 1 :(得分:1)

这个类似乎是一个监听器 - 即RegisterListener。它已通过传递给DNSSD方法在register(..)中注册为听众。

有关Observer pattern

的更多信息,请参阅