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

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

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

杨__羊羊 2019-06-26 16:13:06
您什么时候在Java中使用varargs?我怕瓦拉格。我不知道该用它们做什么。另外,让人们随心所欲地表达自己的观点是危险的。什么是一个上下文的例子,将是一个很好的地方使用它们?
查看完整描述

3 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

一个好的经验法则是:

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

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

可以将此规则扩展为包含具有List<T>参数,只要此参数仅用于输入(即列表不被方法修改)。

此外,我不想使用f(Object... args)因为它滑向了使用不明确的API的编程方式。

就例子而言,我在设计GridLayout,我可以在这里添加几个JComponentS一次呼叫:

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-06-26
?
胡子哥哥

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

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

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

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);

当我确信我的代码工作正常时,我会注释掉调试器Print()方法中的代码,这样日志就不会包含太多无关和不想要的信息,但是我可以不对每个调用进行注释。稍后,如果我发现了一个bug,我只需取消对调试器Print()代码的注释,而我对调试器Print()的所有调用都会被重新激活。

当然,我也可以很容易地避开varargs,做以下事情:

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

但是,在本例中,当我注释出调试器Print()代码时,服务器仍然要经历将每次调用中的所有变量连接到调试器Print()中的麻烦,即使对结果字符串不做任何操作。但是,如果我使用varargs,服务器只需将它们放在一个数组中,它就会意识到它不需要它们。节省了很多时间。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 406 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号