2010-03-06 84 views
0

在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”类)?

+0

无关,但您的方式想要删除接口前面的“I”,以便遵循Java编码标准(并为了您的Java程序员的可读性)。 – 2010-03-06 20:07:48

+0

没错,但是我在编写代码的时候并没有完全意识到java编码标准.. :-) – moritz 2012-01-14 14:22:57

回答

4

ServiceAnnouncer已经通过自身的DNSSD.register()方法,而这又显然期待的RegisterListener任何情况下的最后一个参数。这样DNSSD可以直接处理ServiceAnnouncer实例。

+0

谢谢你的回答。它通俗易懂。但我不明白,你为什么说“DNSSD.register()”期望RegisterListener的一个实例?它期望一个使用RegisterListener作为接口的类的实例。 – Roman 2010-03-06 21:16:26

+0

您也可以将其读为:实现* RegisterListener的实例*。 – BalusC 2010-03-06 21:19:35

1

看来这个班是听众 - 即RegisterListener。它已通过自己的register(..)方法注册为DNSSD中的听众。

欲了解更多信息,请阅读Observer pattern

相关问题