Java 如何应用依赖于实现的方法调用?
我有一个Java 如何应用依赖于实现的方法调用?,java,oop,Java,Oop,我有一个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 }
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()
方法,因为对象不应该知道如何删除自己
还有什么?方法重载:
void delete(Foo f) {}
void delete(Bar b) {}
您仍然可以通过编写
class MyService<T> {
void delete(T obj) {
// Only the delete logic, but nothing specific for any type
}
}
classmyservice{
作废删除(T obj){
//只有删除逻辑,但没有特定于任何类型的逻辑
}
}
然后,对于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);
}
}
类MyFooService扩展了MyService{
作废删除(Foo obj){
//执行一些foo删除逻辑
//最后,调用超类,因为它知道如何执行真正的删除操作
super.删除(obj);
}
}
这样,您的
Foo
特定逻辑位于MyFooService
中,并且您的Foo
逻辑被放入一个单独的类中。作为额外的好处,这给了您可以进行良好单元测试的类。我认为最好创建一个表示DeleteType的枚举
public enum DeleteType {
Foo, Bar //..... }
在MyService
中,delete方法可以接受两个参数,如
void delete(DeleteType type, Object object) {
switch(type) {
case Foo:
//Deletion of Foo objects....
break;
case Bar:
//Deletion of Bar objects....
break;
....
}
}
如果希望
delete
方法签名完好无损,那么类型可以存储在obj
本身中(通过使obj
的类遵守一个契约(接口
),这将使它返回其类型
)我会把它变成一个抽象方法,让子类处理删除逻辑(类似于插入、更新、检索、检索所有…),这非常好!我认为它最适合我的需要。