如何处理Java中的参数区别?

时间:2015-07-27 13:40:00

标签: java

我需要一个需要不同参数的方法,并且根据参数的不同表现,如下例所示:

public void doSomething(A a, B b, C c) {
    doSomeGeneralStuff();

    if a.isPresent() {
        doSomethingWithA();
    }
    if b.isPresent() {
        doSomethingWithB();
    }
    if c.isPresent() {
        doSomethingWithC();
    }
}

另一种选择是:

public void doSomething(A a) {
    doSomeGeneralStuff();
    doSomethingWithA();
}
public void doSomething(B b) {
    doSomeGeneralStuff();
    doSomethingWithB();
}
public void doSomething(C c) {
    doSomeGeneralStuff();
    doSomethingWithC();
}

但是在第二个例子中我会有一堆冗余代码,这就是为什么我仍然不满意。还有哪些其他模式可以解决这个问题?

4 个答案:

答案 0 :(得分:8)

您可以使用继承。为所有ABC

设置一个通用界面
public void doSomething(Common abc) {
    doSomeGeneralStuff();
    abc.doSomethingWithABC();
}

interface Common {
    void doSomethingWithABC();
}

class A implements Common {

class B implements Common {

class C implements Common {

答案 1 :(得分:1)

我赞同彼得·劳瑞的回答,并提出了另一种选择:

...

答案 2 :(得分:0)

为什么不将类型作为parameter传递,类似

private void doSomething(Class<?> cls) {
    if (cls == String.class) { doSomething1();
}
    else if (cls == int.class) { doSomething2();
 }
}

答案 3 :(得分:0)

设计一个接口 I,它声明doSomething并将您的类A,B和C调整为实现该接口:

class A implements I

然后重构doSomething以利用变量参数列表

void doSomething(I... eyes)
{
    for (i : eyes){
        doSomeGeneralStuff()
        i.doSomething();
    }    
}

您可以使用任意数量的对象致电doSomething,只要他们实施I:例如,doSomething(a)doSomething(a, b)doSomething(a, b, c)等。