使用varargs时的恶劣情况

时间:2016-11-24 09:27:49

标签: java-7 variadic-functions

我有两种方法:

  1. addMsg(String summary,String msg,Object ... params)

  2. addMsg(String msg,Object ... params)

  3. 执行 addMsg时将调用哪一个(" str1"," str2"," str3")

    我可以选择使用哪一个吗?

2 个答案:

答案 0 :(得分:1)

  

执行addMsg时会调用哪一个(" str1"," str2"," str3")?

将调用长版本:

public void addMsg(String summary, String msg, Object... params)
  

我可以选择使用哪一个吗?

如果您确实无法将方法名称更改为具有意图揭示名称或通过更改类型更改签名(例如,您正在处理遗留应用程序),则可以始终使用简短版本调用反射:

Method hiddenMethod = Arrays.stream(this.getClass().getDeclaredMethods())
                         .filter(method -> "addMsg".equals(method.getName()))
                         .filter(method -> method.getParameterTypes().length == 2)
                         .findFirst()
                         .orElseThrow(IllegalStateException::new);

Object[] params = { "message" , new String[]{"param1", "param2"}};

hiddenMethod.invoke(this,params);

如果可以避免这种情况,就不要这样做

答案 1 :(得分:0)

我实际上认为这是对varargs的误用。 我建议你做的是

addMsg(Integer type, Object... params)

你最好区分治疗使用不同的变量(整数,正如我所建议的)。