相当于Java的可可代表/ Objective-C的非正式协议?(Java equivalent o

2019-07-31 03:35发布

什么是Java相当于可可代表?

(我知道我可以传递给类的接口,并且具有类调用适当的方法,但我不知道是否有任何其他的方式来实现更接近于可可/ Objective-C的非正式协议)

Answer 1:

简短的回答是没有什么用Java接近你想,但也有替代品。 委托模式并不难实现,但它只是并不像与Objective-C的做起来一样方便。

在Objective-C的原因“非正式协议”的工作是因为语言支持 ,它允许你添加方法,现有的类没有子他们,甚至无需访问源代码。 因此,大多数非正式协议是NSObject的上一个类别。 这在Java中显然是不可能的。

客观-C 2.0 OPTS为@optional协议方法,这是一种更清洁的抽象和优选为新的代码,但即使进一步从具有Java中的等价物。

老实说,最灵活的方式是定义一个委托协议,则有类实现的所有方法。 (随着现代的IDE像Eclipse,这是微不足道的。)许多Java接口有一个附带的适配器类,而这是不要求用户实施了大量的空方法的常用方法,但是它限制了继承,这使得代码设计呆板。 (乔希布洛赫在他的著作“有效的Java”解决了这个。)我的建议是只先提供一个接口,然后添加适配器,如果它是真正必要的。

不管你做什么,避免抛出一个UnsupportedOperationException为“未实现”的方法。 这迫使委托类来处理例外,应该是可选的方法。 正确的做法是实现什么都不做,返回默认值,等等。这些价值观应该有据可查对于不具有void返回类型的方法的方法。



Answer 2:

最好的模拟一个非正式协议,我能想到的是,也有一个适配器类,允许实施者,以避免执行每一个方法的接口。

public class MyClass {

    private MyClassDelegate delegate;

    public MyClass () {

    }

    // do interesting stuff

    void setDelegate(MyClassDelegate delegate) {
        this.delegate = delegate;
    }

    interface MyClassDelegate {
        void aboutToDoSomethingAwesome();
        void didSomethingAwesome();
    }

    class MyClassDelegateAdapter implements MyClassDelegate {

        @Override
        public void aboutToDoSomethingAwesome() {
            /* do nothing */
        }

        @Override
        public void didSomethingAwesome() {
            /* do nothing */
        }
    }
}

这时,有人可以一起去,只是实现他们关心的内容:

class AwesomeDelegate extends MyClassDelegateAdapter {

    @Override
    public void didSomethingAwesome() {
        System.out.println("Yeah!");
    }
}

要么,或纯反射主叫“已知”的方法。 但是,这是疯了。



Answer 3:

没有什么在你的Java对象使用委托模式阻止你(这只是一个不常用的JDK模式就像是可可)。 只要有一个delegate符合你的类型的伊娃WhateverDelegate接口,然后在您的实例方法,您想委派,转发方法调用到委托对象,如果它的存在。 你可能会用的东西,看起来很像落得这样 ,除Java之外代替的OBJ-C。

至于可选接口去,那会比较困难。 我建议,宣布接口,宣称实现了可选的方法作为空方法的抽象类,然后继承抽象类,覆盖想要这个特殊的对象来实现所有可选方法。 这里有一个潜在的严重限制,由于缺乏在Java中多重继承的,但是这是亲如我能想出。



文章来源: Java equivalent of Cocoa delegates / Objective-C informal protocols?