为了账号安全,请及时绑定邮箱和手机立即绑定

你什么时候在Java中使用varargs?

你什么时候在Java中使用varargs?

繁星淼淼 2019-07-23 10:04:08
你什么时候在Java中使用varargs?我害怕varargs。我不知道该怎么用它们。另外,让人们通过他们想要的许多论点是危险的。什么是上下文的一个例子,它将是一个使用它们的好地方?
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

一个好的经验法则是:

“对任何需要T数组(无论T类型)作为输入的方法(或构造函数)使用varargs”。

这将使这些方法的调用更容易(不需要这样做new T[]{...})。

您可以扩展此规则以包含带List<T>参数的方法,前提是此参数仅用于输入(即,该方法不修改列表)。

另外,我会避免使用,f(Object... args)因为它的API 会出现不明确的编程方式。

在示例方面,我在DesignGridLayout中使用它,我可以JComponent在一个调用中添加几个s:

layout.row().grid(new JLabel("Label")).add(field1, field2, field3);

在上面的代码中,add()方法定义为add(JComponent... components)

最后,这些方法的实现必须注意它可以用空的vararg调用它!如果你想强加至少一个参数,那么你必须使用一个丑陋的技巧,例如:

void f(T arg1, T... args) {...}

我认为这个技巧很难看,因为该方法的实现不如仅仅T... args在其参数列表中那么简单。

希望这有助于澄清关于varargs的观点。


查看完整回答
反对 回复 2019-07-23
?
烙印99

TA贡献1829条经验 获得超13个赞

我经常使用varargs输出到日志以进行调试。

几乎我的应用程序中的每个类都有一个方法debugPrint():

private void debugPrint(Object... msg) {
    for (Object item : msg) System.out.print(item);
    System.out.println();}

然后,在类的方法中,我有如下调用:

debugPrint("for assignment ", hwId, ", student ", studentId, ", question ",
    serialNo, ", the grade is ", grade);

当我对我的代码正常工作感到满意时,我会在debugPrint()方法中注释掉代码,这样日志就不会包含太多无关和不需要的信息,但是我可以将对debugPrint()的各个调用取消注释。稍后,如果我发现了一个错误,我只需取消注释debugPrint()代码,并重新激活我对debugPrint()的所有调用。

当然,我可以轻易地避开varargs并执行以下操作:

private void debugPrint(String msg) {
    System.out.println(msg);}debugPrint("for assignment " + hwId + ", student " + studentId + ", question "
    + serialNo + ", the grade is " + grade);

但是,在这种情况下,当我注释掉debugPrint()代码时,服务器仍然需要在每次调用debugPrint()时连接所有变量的麻烦,即使对结果字符串没有任何处理。但是,如果我使用varargs,服务器只有在意识到它不需要它们之前才必须将它们放在一个数组中。节省了很多时间。


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 371 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信