qua*_*lar 5 java parameters methods interface
该主题已经说过:
我现在正在考虑关注设计问题:我为包含各种方法的特定类型的对象定义了一个接口.现在我遇到了这个问题,这个接口的不同实现需要额外的/不同的方法参数(因为它们的实现方式使得这是必要的),我无法将其合并到接口中,因为它们并非所有接口实现都通用.
现在我意识到接口实现可能带有自己的属性文件,从那里加载其他参数,但是如果这些参数需要在运行时传递呢?
目前我只能想到传递一个Map<String, Object> parameters来克服这个问题 - 因为像DocumentBuilderFactory这样的JDK类通过提供这样的方法来做一些非常相似的事情setAttribute(String attName, Object attValue)似乎是解决这个问题的可行方法.不过,我会对别人如何解决这样的问题,另类想法感兴趣吗?
我不想从接口派生并添加其他方法,因为在我的情况下,我将不得不NotImplementException从基本接口的方法抛出.
更新:
地图方法最终可能出现什么问题?如果实现类无法使用其他参数,则可以完全忽略它.其他人可能会检查Map是否包含所需的参数名称,检查其值的类型并在有效时使用它们,否则抛出异常.我也看到这被用于抽象类JAXBContext,所以它似乎是一种常见的方法..
更新:
我决定采用地图方法,因为我没有看到任何明显的缺点,它也被用在JDK中(是的,我知道这并不一定意味着很多:)因为我不能接受这个问题的答案,我会赞成.感谢您的输入!
问候,
--qu
您不能设计扩展您的(超级)接口的子接口吗?无论如何,如果您需要根据实现而具有不同参数的方法,我会发现设计问题!
编辑:澄清代码
interface CommonBehaviour
{
void methodA(int aParam);
}
interface SpecificBehaviour extends CommonBehaviour
{
void methodB(int aParam, int anotherParam);
}
class SpecificBehaviourImpl implements SpecificBehaviour
{
void methodA(int aParam)
{
//do something common
}
void methodB(int aParam, int anotherParam)
{
//do something specific
}
}
CommonBehaviour myObj = new SpecificBehaviourImpl();
Run Code Online (Sandbox Code Playgroud)
编辑:您可能会受益于命令模式:“使用命令对象可以更轻松地构造需要在选择的时间委托、排序或执行方法调用的通用组件,而无需知道方法或方法的所有者参数。” (来源:维基百科)
我认为这种Map方法没有什么好处,我可能会接受它作为现有代码的修复,它允许您拥有任何参数数量和类型,但无需正式检查!您试图在给定变量、运行时、状态的情况下定义通用行为(接口方法)。