我有一个delete(object)
方法,应根据要删除的对象执行不同的代码。
class MyService {
void delete(Object obj) {
if (obj instanceof Foo) {
//execute some foo deletion logic
}
if (obj instanceof Bar) {
//execute some bar deletion logic
}
//if... and so on
}
}
从设计的角度来看,我如何避免instanceof
检查?
我无法在所有实现中引入delete()
方法,因为对象不应该知道它们应该如何删除自己。
还有什么?
答案 0 :(得分:5)
您仍然可以通过编写
来使用子类化机制(甚至可以使其成为通用的)class MyService<T> {
void delete(T obj) {
// Only the delete logic, but nothing specific for any type
}
}
然后,对于Foo,你要创建一个子类:
class MyFooService extends MyService<Foo> {
void delete(Foo obj) {
//execute some foo deletion logic
// finally, invoke super class as it knows how to do the real delete action
super.delete(obj);
}
}
这样,您的Foo
特定逻辑位于MyFooService
,您的Foo
逻辑将被置于单独的类中。作为额外的奖励,这可以为您提供经过单元测试的课程。
答案 1 :(得分:2)
方法重载:
void delete(Foo f) {}
void delete(Bar b) {}
答案 2 :(得分:0)
IMO最好创建一个代表DeleteType的枚举说
public enum DeleteType {
Foo, Bar //..... }
并且在MyService
中,delete方法可以使用2个参数,例如
void delete(DeleteType type, Object object) {
switch(type) {
case Foo:
//Deletion of Foo objects....
break;
case Bar:
//Deletion of Bar objects....
break;
....
}
}
如果您希望delete
方法签名完好无损,那么type
可以存储在obj
内(通过使obj
的类符合合同(interface
)将使return
成为type
)