我继承了一些遗留Java(1.4)代码,这个设计决定定期出现。我无法理解是否有任何目的或理由。
public interface SoapFacade extends iConfigurable{ }
public class SoapFacadeBase implements SoapFacade{
...
}
public class SoapFacadeImpl extends SoapFacadeBase implements SoapFacade{
...
}
据我了解接口(以及我的实验已经加强),没有任何目的让父和子实现相同的接口。在此方案中,SoapFacade
中的所有内容都在SoapFacadeBase
中实现,但iConfigurable
中的方法在SoapFacadeImpl
中实现。但是,这并不需要SoapFacadeImpl
实施SoapFacade
。
是否有一些我不了解的接口会给这种模式带来某些目的或好处?除了缺乏清晰度之外,还有潜在的成本会导致重构吗?或者是否应该为了清晰/简单而进行重构?
答案 0 :(得分:39)
据我了解接口(我的实验已经加强),没有任何目的让父母和孩子都实现相同的界面。
没有。从技术上讲,它完全是多余的。
然而, 确实记录了您希望SoapFacadeImpl
成为SoapFacade
的事实,如果您(或其他人)决定,它会确保您收到编译错误从基类中删除implements SoapFacade
。
您可以在标准Java Collections API中的任何位置看到此模式。 ArrayList
实现了List
,即使它的基类(AbstractList
)已经存在。同样适用于HashSet
/ AbstractSet
和Set
界面。
答案 1 :(得分:11)
如果您还将界面用作标记。 Class.getInterfaces();
只会直接返回实例化接口。
答案 2 :(得分:0)
我实际上发现那个设计毫无意义。如上所述,已实现的接口只是继承的,因此不需要在子类上复制和粘贴“implements SomeInterface”。 它不是更清晰,更聪明,或者无论如何......
答案 3 :(得分:-3)
这是无稽之谈,不要这样做。
特别是在像java集合这样的公共API中。这绝对是胡说八道。