我有一个问题,有点理论性:
假设我有以下类:
interface ReportInterface {
void execute();
}
class Report implements ReportInterface {
private final Repository rep;
Report(Repository ref){
this.rep = ref;
}
public void execute(){
//do some logic
}
}
class ReportWithSetter implements ReportInterface {
private final Repository rep;
private String release;
ReportWithSetter(Repository ref){
rep = ref;
}
public void execute(){
if (release == null) throw IlligalArgumentException("release is not specified");
//do some logic
}
public void setRelease(String release){
this.release=release;
}
}
第二份报告需要一个额外的参数release才能正常工作,但我的接口未定义
execute
方法的参数,因此我通过使用setter方法来解决这个问题,代码如下:ReportWithSetter rep2 = new ReportWithSetter (rep);
rep.setRelease("R1.1");
rep.execute();
所以我不喜欢这个额外的rep.setRelease
。它看起来很奇怪和人工 - 这个类的用户可能会感到困惑,例如,如果我在Spring中将该类作为单例bean,那么它是潜在错误的来源,如果第二次请求它,有人忘记了第二次触发rep.setRelease
。除了把它放进构造函数里(我想把它做成一个Spring bean),有什么最佳实践来处理这种情况吗?
ReportWithSetter
和Report
可能不应该实现相同的Report
接口。ReportWithSetter.execute
应该带有一个release
参数。 - SweeperVersionnable
的接口,其中只有一个getRelease()
方法,将ReportWithSetter
重命名为VersionnableReport
,然后让它同时实现Report
和Versionnable
接口。 - Vincent C.ReportInterface
中添加一个新的重载方法execute(String release)
,并为execute()
方法提供一个默认值。 - Jerry Chin