我有多个服务(在Spring MVC中),它们是全局服务的子代。所以我需要通过这个例子了解多种方法的最佳实践(或您的意见):
//Domain classes
public class MyParentObject{}
public class MyObj extends MyParentObject{}
//Services
public class MyParentObjectServiceImpl implements MyParentObjectService{
@Override
public MyParentObject findObjectByProp(String prop, String objectType){
//myCode (not abstract class)
}
}
public class MyObjServiceImpl extends MyParentObjectServiceImpl implements MyObjectService{
private myObjType = "MyObj";
@Override
public MyObj findMyObjByProp(String prop){
return (MyObj) super.findObjectByProp(prop, this.myObjType);
}
}
在这种方法中,我使用这样的调用:
MyObj foo = myObjService.findMyObjByProp(prop);
所以我需要知道这种方法是“更好”还是更适合用第二个参数直接调用父方法。 E.g:
MyObj foo = (MyObj)myParentObjectService.findObjectByProp(prop, "MyObj");
..并避免创建第二种方法,更具体。重要的是要知道无论如何都会创建子服务,因为我们有很多特定于域对象的代码。
我认为第一种方法更好,因为更具可读性,但我需要通过一些文件,博客或意见来支持这一决定,以便与同事讨论这些设计。
答案 0 :(得分:3)
这看起来像一个标记的类层次结构。在不知道细节的情况下,很难对这种设计的价值进行评论。但是,我建议采用一种略微不同的方法,即通过基类来获得一些类型安全性。
特别是:
public /* abstract */ class MyParentObjectServiceImpl<T extends MyParentObject>
implements MyParentObjectService{
MyParentObjectServiceImpl(Class<T> type) { this.type = type; }
private final Class<T> type; // subclasses provide this
@Override
public T findObjectByProp(String prop){
//you can use type for object specific stuff
}
}
public class MyObjServiceImpl extends MyParentObjectServiceImpl<MyObj>
// You might not need this interface anymore
// if the only method defined is findMyObjByProp
/* implements MyObjectService */ {
MyObjServiceImpl() {
super(MyObj.class);
}
@Override
public /* final */ MyObj findMyObjByProp(String prop) {
return (MyObj) super.findObjectByProp(prop, this.myObjType);
}
}
你肯定会获得类型安全性(强制转换只会出现在基类中),你可以摆脱&#34;标签&#34; (标识不同对象的字符串)并可能减少实现整个层次结构所需的类/接口数。我成功地使用了这种方法几次。请注意,如果基类是抽象的,则此方法最有效。思想的食物。