我发现一些替代方法未使用方法签名中的所有参数。
例如:
@Override
protected void setSomething(Object a, Object b, Object c) {
this.a = a
this.b = b;
// the parameter c is not used (ignored)
}
Run Code Online (Sandbox Code Playgroud)
通常,父类不必关心子代将如何实现抽象方法。
但是在MHO中,将使用方法的参数,当子类实现不需要参数时,这种情况非常少见,当这种情况发生时,接口的设计或抽象类可能存在问题。
一个功能的基础是:输入->输入过程->输出。
有时您需要计算这些输入,但是如果您不打算在函数的过程中使用其中的一些输入,则不应将这些输入作为函数的输入。
您可以跳过这些输入的计算,从而调用使用所有输入的精确函数,因此该精确函数。
这种情况唯一可以接受的情况是,当我们不想父类的行为时,可以这样写:
@Override
protected void setSomething(Object a, Object b, Object c) {
//Nothing to do
}
Run Code Online (Sandbox Code Playgroud)
要么
@Override
protected void setSomething(Object a, Object b, Object c) {
throw new UnsupportedOperationException(...);
}
Run Code Online (Sandbox Code Playgroud)
声纳说:
未使用的参数会产生误导。无论传递给此类参数的值是什么,其行为都将相同。
我的问题是:当我们重写方法时,应该使用方法签名中的所有参数吗?
当我说“使用所有参数”时,我试图说方法签名中的所有参数实际上都在方法的主体(实现)中使用。
当我们覆盖一个方法时,我们应该使用该方法签名中的所有参数吗?
覆盖方法时,被覆盖的方法必须定义与超级方法相同的参数。
您没有义务在实现中使用所有参数-这取决于您希望通过此实现实现什么,有时可能不需要所有参数。
但是,在方法实现中使用未使用的方法参数是不良设计的标志。定义方法(正在abstract执行或已实现)时,应尝试回答“为什么需要此参数?”的问题。和“是否将始终使用此参数?” 。如果有可能在实现中不使用某些参数的情况,则可以定义一些重载方法。
以这个例子为例。让我们有这个方法
void someMethod(String first, String optionalParameter) { ... }
Run Code Online (Sandbox Code Playgroud)
第二个参数是可选的(即可能是必需的,也可能不是)- null当不需要该参数时,您可以传递或进行任何操作。在这种情况下,我将重载两种方法
void someMethod(String first) { ... }
void someMethod(String first, String second) { ... }
Run Code Online (Sandbox Code Playgroud)
并且我还将确保在相应的实现中使用所有参数。
| 归档时间: |
|
| 查看次数: |
2793 次 |
| 最近记录: |