我有多个服务(在 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);
所以我需要知道这种方法是否“更好”或更适合直接使用第二个参数调用父方法。例如:
MyObj foo = (MyObj)myParentObjectService.findObjectByProp(prop, "MyObj");
..并避免创建第二种方法,更具体。重要的是要知道无论如何都会创建子服务,因为我们有很多特定于域对象的代码。
我的想法是第一种方法更好,因为它更具可读性,但我需要用一些文档、博客或意见来支持这个决定,以便与我的同事讨论这个设计。
最佳答案
这看起来像一个带标签的类层次结构。在不了解细节的情况下,很难笼统地评论这种设计的值(value)。但是,我推荐的一种略有不同的方法是泛化您的基类以获得一点类型安全。
特别是:
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);
}
}
您肯定会获得类型安全性(强制转换只会出现在基类中),您摆脱了“标签”(标识不同对象的字符串)并可能减少实现所需的类/接口(interface)的数量整个层次结构。我多次成功地使用了这种方法。请注意,如果基类是抽象的,这种方法效果最好。思想的食粮。
关于java - 代码重复与可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27362559/