假设您有一个带有方法签名Employee
的接口int calculateWage(int hoursPerWeek, int overtime);
。如果每周一次实施不使用变量overtime
怎么办?例如代码
int calculateWage(int hoursPerWeek, int overtime) {
return hoursPerWeek*wage;
}
看起来很傻并且因为没有使用加班而产生警告。
答案 0 :(得分:1)
这不是问题。使用接口是因为它们理论上可以表示实现这些方法的任意数量的不同类。这些类中的一些(即使它们仅在理论上存在)可能会使用所有参数,而其他类可能不会。
这是完全合情合理的。事实上,我认为这种语言定义的某些接口非常正常。在许多(如果不是大多数)我编写的实现ActionListener
的类中,我根本不使用参数ActionPerformed
,因为特定的实现不需要它。但是信息存在于需要 的情况下。
答案 1 :(得分:1)
如果界面假设每周工作时间包括加班时间,则所有 计算
return (hoursPerWeek - overtime)*wage + overtime*wage;
评论说加班费不是额外的。
如果界面没有假设每周工作时间包括加班时间,则应该
return hoursPerWeek*wage + overtime*0; // why did they work overtime?
或
if( overtime > 0 ) throw new IllegalArgumentException( "..." ); // unexpected!
return hoursPerWeek*wage;
无论如何,这将支持界面使用防御性编码签订的合同。
答案 2 :(得分:0)
您的界面(类?)对于分析器来说真的很傻和可疑。明显的答案是介绍两种方法:1,它没有overtime
参数,而有一种方法。像这样:
int calculateWage(int hoursPerWeek, int overtime) {
return (hoursPerWeek + overtim) * wage;
}
int calculateWage(int hoursPerWeek) {
return calculateWage(hoursPerWeek, 0);
}
如果你关心需要实现这两种方法的类 - 好的,在Java 8中你可以基于default
实现,在实践中,好的分析器应该区别于你可以遵循的其他方式:
interface WageCalculator {
int calculateWage(int hoursPerWeek, int overtime);
}
class GreedyWageCalculator implements WageCalculator {
@Override
int calculateWage(int hoursPerWeek, int overtime) {
return hoursPerWeek * wage;
}
}
这种方法如here所示。
最糟糕的情况是,尽管我个人不喜欢这种做法,但你可以依赖旧转储@SuppressWarnings("unused")
。另一种方法是使用一些空的'代码片段。有几个广泛使用的,但我再次不喜欢这种make your compiler happy
练习。问题有点不清楚:如果我们谈论接口,为什么实现在这里?如果我们谈论具有默认实现的接口,您可以始终实现2个方法,如上面的第一个示例。