【问题标题】:Can an object know from which object its method is called?一个对象能知道它的方法是从哪个对象调用的吗?
【发布时间】:2010-03-06 19:08:10
【问题描述】:

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

【问题讨论】:

  • 不相关,但您想删除接口前面的“I”,以遵循 Java 编码标准(并为您的 Java 程序员同行提供可读性)。
  • 是的,但我在编写代码时并不完全了解 Java 编码标准.. :-)

标签: java oop class methods


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。这无疑是有道理的。但我不明白,你为什么说“DNSSD.register()”需要一个RegisterListener的实例?它期望使用 RegisterListener 作为接口的类的实例。
  • 您也可以将其解读为:一个实例实现 RegisterListener.
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2011-02-08
    • 1970-01-01
    • 2022-12-14
    相关资源
    最近更新 更多