java 管理多个参数的更好方法是什么[已关闭]

uyto3xhc  于 2023-01-29  发布在  Java
关注(0)|答案(2)|浏览(165)

4小时前关门了。
Improve this question
我有这样的功能

public Parcel dispatcher(arg1...arg12)

始终保证只有两个参数始终有效,而其余参数在任何给定点为空。
现在我是这样处理的

if (arg1 != null){
        if(arg2 != null)
        else if(arg3 != null)
        ...
        else if(arg12 != null)
    } else if (arg2 != null){
        if(arg3 != null)
        ...
        else if(arg12 != null)
    }
    ...
    else if(arg11 != null){
        /*all unique combinations 
are tested, hence arg12 will 
always be valid here.*/
    }

这种手动测试两个非空参数的每个唯一组合的方法非常烦人,我甚至不想尝试这样做。
有没有更好的办法来处理这件事。
编辑:它对不同的对做不同的事情,对的分组如下:复数,集合,字符串,变量,常量,项
每一个都有一个群,但不一定只有一个特定的群是有效的,我的意思是,一个复数和一个集合可以是有效的,或者两个复数的对可以是有效的。

rdlzhqv9

rdlzhqv91#

如果我没理解错你的问题,你需要一个方法,它总是接受两个参数,也可以选择接受其他参数。
使用可变位数(Variable Arity,又称varargs)方法,该方法自Java 5起可用:

public Parcel dispatcher(Type1 first, Type2 second, Type3... varargs) {
   ...
}

确保:

  1. varargs,对于可选参数,作为方法中的最后一个参数(否则,如果varargs不是最后一个参数,则传入相应方法的任何参数都将被视为varargs参数);
  2. varargs参数的类型必须相同。
1mrurvl1

1mrurvl12#

我认为你可以用反思:

public Parcel dispatcher(Object ...args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

    Map<Integer, String> indexNameMap = new HashMap<>();
    indexNameMap.put(1, "One");
    indexNameMap.put(2, "Two");
    indexNameMap.put(3, "Three");
    // other numbers

    int firstArgsPos = -1;
    int secondArgsPos = -1;
    for (int i = 0; i < args.length; i++) {
        if (args[i] != null) {
            if (firstArgsPos < 0) {
                firstArgsPos = i;
            } else {
                secondArgsPos = i;
                break;
            }
        }
    }
    String className = String.format("%s%sParameter", indexNameMap.get(firstArgsPos + 1), indexNameMap.get(secondArgsPos + 1));
    Class c = Class.forName(className);

    if (c.isInstance(P.class)) {
        Object obj = c.newInstance();
        P cast = P.class.cast(obj);
        cast.setParameter(args[firstArgsPos], args[secondArgsPos]);
        return cast.execute();
    }

    return null;
}
interface P{
    Parcel execute();

    void setParameter(Object first, Object second);
}
class OneTwoParameter implements P{
    String a;
    Integer b;

    @Override
    public Parcel execute() {
        return null;
    }

    @Override
    public void setParameter(Object first, Object second) {
        this.a = (String) first;
        this.b = (Integer) second;
    }
}
class OneThreeParameter implements P{
    String a;
    Double b;

    @Override
    public Parcel execute() {
        return null;
    }
    @Override
    public void setParameter(Object first, Object second) {
        this.a = (String) first;
        this.b = (Double) second;
    }
}

class Parcel{

}

相关问题