是否有为接口方法创建默认实现的首选方法或风格?假设我有一个常用的接口,在90%的情况下,我想要的功能是相同的。
我的第一反应是创建一个具有静态方法的具体类。然后,当我需要默认功能时,我会将该功能委托给静态方法。
下面是一个简单的例子:
接口
public interface StuffDoer{
public abstract void doStuff();
}方法的具体实现
public class ConcreteStuffDoer{
public static void doStuff(){
dosomestuff...
}
}使用默认功能的具体实现
public class MyClass implements StuffDoer{
public void doStuff(){
ConcreteSuffDoer.doStuff();
}
}这里有没有更好的方法?
编辑
在看了一些建议的解决方案后,我想我应该更清楚我的意图。从本质上讲,我试图解决Java不允许多重继承的问题。另外,需要说明的是,我并不是要声明Java是否应该允许多重继承。我只是在寻找为实现接口的类创建默认方法实现的最佳方式。
发布于 2010-08-10 00:45:12
这是我将采取的方法:
public interface MyInterface {
MyInterface DEFAULT = new MyDefaultImplementation();
public static class MyDefaultImplemenation implements MyInterface {
}
}当然,MyDefaultImplementation可能需要是私有的,或者是它自己的顶级类,这取决于什么是有意义的。
然后,您可以在您的实现中包含以下内容:
public class MyClass implements MyInterface {
@Override
public int someInterfaceMethod(String param) {
return DEFAULT.someInterfaceMethod(param);
}
}它比其他地方存在但不被接口引用的默认实现类更具自文档化,最终也更灵活。这样,您就可以在需要时将默认实现作为方法参数进行传递(使用静态方法不能做到这一点)。
当然,只有在不涉及状态的情况下,上述方法才有效。
发布于 2010-08-07 03:29:26
您可以将接口转换为抽象类,并根据需要为方法提供默认实现。
更新:我明白了,多重继承关闭了将接口更改为抽象类的过程……在这种情况下,我会和你做同样的事情。如果方法的默认实现不依赖于状态,那么它们的最佳位置确实是在静态实用程序类中。但是,如果涉及到状态,我会考虑对象组合,它甚至可能以类似于Decorator的形式结束。
发布于 2014-11-17 18:39:18
现在Java 8发布了,这个模式更好了:
public interface StuffDoer{
default void doStuff() {
dosomestuff...
}
}
public class MyClass implements StuffDoer {
// doStuff automatically defined
}Lambda获得了所有的关注,但这是Java8给我们公司带来的最明显的好处。当我们不再需要抽象类来实现默认方法时,我们的继承层次结构变得简单得多。
https://stackoverflow.com/questions/3427073
复制相似问题