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

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

我怕瓦拉格。我不知道该用它们做什么。

另外,让人们随心所欲地表达自己的观点是危险的。

什么是一个上下文的例子,将是一个很好的地方使用它们?


杨__羊羊
浏览 407回答 3
3回答

幕布斯7119047

一个好的经验法则是:“将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的观点。

胡子哥哥

我经常使用varargs输出日志以进行调试。几乎我的应用程序中的每个类都有一个方法调试器Print():private&nbsp;void&nbsp;debugPrint(Object...&nbsp;msg)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Object&nbsp;item&nbsp;:&nbsp;msg)&nbsp;System.out.print(item); &nbsp;&nbsp;&nbsp;&nbsp;System.out.println();}然后,在类的方法中,我有如下调用:debugPrint("for&nbsp;assignment&nbsp;",&nbsp;hwId,&nbsp;",&nbsp;student&nbsp;",&nbsp;studentId,&nbsp;",&nbsp;question&nbsp;", &nbsp;&nbsp;&nbsp;&nbsp;serialNo,&nbsp;",&nbsp;the&nbsp;grade&nbsp;is&nbsp;",&nbsp;grade);当我确信我的代码工作正常时,我会注释掉调试器Print()方法中的代码,这样日志就不会包含太多无关和不想要的信息,但是我可以不对每个调用进行注释。稍后,如果我发现了一个bug,我只需取消对调试器Print()代码的注释,而我对调试器Print()的所有调用都会被重新激活。当然,我也可以很容易地避开varargs,做以下事情:private&nbsp;void&nbsp;debugPrint(String&nbsp;msg)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;System.out.println(msg);}debugPrint("for&nbsp;assignment&nbsp;"&nbsp;+&nbsp;hwId&nbsp;+&nbsp;",&nbsp;student&nbsp;"&nbsp;+&nbsp;studentId&nbsp;+&nbsp;",&nbsp;question&nbsp;" &nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;serialNo&nbsp;+&nbsp;",&nbsp;the&nbsp;grade&nbsp;is&nbsp;"&nbsp;+&nbsp;grade);但是,在本例中,当我注释出调试器Print()代码时,服务器仍然要经历将每次调用中的所有变量连接到调试器Print()中的麻烦,即使对结果字符串不做任何操作。但是,如果我使用varargs,服务器只需将它们放在一个数组中,它就会意识到它不需要它们。节省了很多时间。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java