请处理这个基本问题。

我有一个abstract class C1扩展了另一个abstract class C0,并被多个sub-classes (C21 and C22)扩展了。

@Component
public abstract class C0 {
    protected abstract String getCaller();
//Some other methods.
}




public abstract class C1 extends C0 {
//Set of methods which are used by children and then calls methods of C0 which then use getCaller();
}




    @Controller
    public class C21 extends C1 {

    @RequestMapping(value = "abc", method = RequestMethod.GET)
    public String start(@RequestParam(value = "kw", required = true) String p1,
            @RequestParam(value = Constant.REQUEST_PARAM_KEYWORDID, required = true) long p2) throws Exception {
//Some processing and calls controllers defined in abstract class C1
        return "200";
    }


    @Override
    protected String getCaller() {
        return "C21";
    }

}




@Controller
public class C22 extends C1 {

    @RequestMapping(value = "abc", method = RequestMethod.GET)
    public String start(@RequestParam(value = "kw", required = true) String p1,
            @RequestParam(value = Constant.REQUEST_PARAM_KEYWORDID, required = true) long p2) throws Exception {
//Some processing and calls controllers defined in abstract class C1
        return "200";
    }


    @Override
    protected String getCaller() {
        return "C22";
    }

}


C0包含抽象方法getCaller(); C21和C22的调用者不同,但是可以通过仅传递给这些类的方法start(p1,p2)的参数来识别它们。

start(p1,p2)在两个类中都做类似的事情。 C21和C22的唯一区别是getCaller()的实现是固定的,并且始终可以从启动参数中提取。因此,我决定创建单一类而不是C21和C22。

我无法创建setCaller(),因此,我想在抽象final method中创建一个caller和一个私有变量class C1,这些变量可以用start方法的参数填充并在getCaller()中返回(称为来自abstract class C0)。

这是正确的方法吗?有没有更好的方法或模式呢?

最佳答案

C21和C22的唯一区别是getCaller()的实现是固定的,并且始终可以从start参数中提取。


由于只需要更改一个方法,因此最好使用单个非抽象实现C1而不是抽象的C1和一对C21C22。您可以执行以下操作:

Caller caller;
public start(SomeType1 p1, SomeType2 p2, SomeType3 p3) {
    caller = new Caller(p1, p2, p3);
    ...
    // Do other stuff
}

public Caller getCaller() {
    return caller;
}


如果除C21C22之外还有其他类继承C1,则您可能希望保留C1抽象,并通过上述实现添加一个非抽象的C2

关于java - 基本的Java重构:将子类的差异委派给父类并合并/删除它们,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14673076/

10-12 22:55