【发布时间】:2015-12-28 03:23:41
【问题描述】:
我发现一些覆盖方法没有使用方法签名中的所有参数。
例如:
@Override
protected void setSomething(Object a, Object b, Object c) {
this.a = a
this.b = b;
// the parameter c is not used (ignored)
}
通常父类不应该关心子类将如何实现抽象方法。
但是在MHO中,要使用方法的参数,当子类实现不需要参数时,这是非常罕见的,当这种情况发生时,可能是接口的设计或抽象的设计有问题类。
一个功能的基础是:输入->输入过程->输出。
有时您需要计算这些输入,但如果您在函数的过程中不使用其中的一些输入,则不应将这些输入作为函数的输入。
你可以跳过这些输入的计算,调用一个使用所有输入的精确函数,所以是精确函数。
这种情况可以接受的唯一情况是,当我们不想要父类的行为时,我们可以这样写:
@Override
protected void setSomething(Object a, Object b, Object c) {
//Nothing to do
}
或者
@Override
protected void setSomething(Object a, Object b, Object c) {
throw new UnsupportedOperationException(...);
}
声纳说:
未使用的参数具有误导性。无论传递给此类的值如何 参数是,行为将是相同的。
我的问题是: 当我们重写一个方法时,我们应该使用方法签名中的所有参数吗?
当我说“使用所有参数”时,我试图说方法签名中的所有参数实际上都在方法的主体(实现)中使用。
【问题讨论】:
-
“我发现一些覆盖方法没有使用方法签名中的所有参数”你在哪里看到过这个?
-
“当我们重写一个方法时,我们应该使用方法签名中的所有参数吗?”。当然不。为什么子类需要所有参数?
-
原谅我,我想我误解了你。我认为您的意思是简单地传递了参数但被忽略了?如果是这种情况,那很好,您不必对参数做任何事情。最初我以为你的意思是超类和子类方法的签名不匹配,这是不可能的。
-
@Neilos 我用一个例子更新了我的问题,是的,重点是,忽略覆盖方法主体中的参数
-
@JesusZavarce 这可能表明有问题,是的,但也可能不是问题。每个案例都必须根据具体情况进行评估,但一般来说,没有普遍的规则说它不好,事实上我可以想到你肯定希望接口实现特定签名但具体类会忽略该参数,但其他实现不会忽略该参数。
标签: java