在java变量参数列表中至少需要一个元素

在此代码构造中:

public MyClass(Integer... numbers) { do_something_with(numbers[]); } 

是否可以要求numbers包含至少一个条目,以便在编译时检查? (在运行时,当然,我可以检查numbers.length。)

显然,我可以这样做:

 public MyClass(Integer number, Integer... more_numbers) { do_something_with(number, more_numbers[]); } 

但这不会很优雅。

我想这样做的原因是为了确保子类不会完全忘记调用此构造函数,这将默认调用super()而列表中没有数字。 在这种情况下,我宁愿得到熟悉的错误消息: Implicit super constructor is undefined. Must explicitly invoke another constructor Implicit super constructor is undefined. Must explicitly invoke another constructor

是否有另一种方法可以实现相同的效果,比如某些@ -annotation将此构造函数标记为非隐式?

我想一个令人难以置信的hacky方法是创建一个no-args方法并将其标记为已弃用。 然后用这两个标志进行编译: -Xlint:deprecation -Werror 。 这将导致使用不推荐使用的方法成为编译时错误。

validation的独特方法是validation参数。

validation参数:

 if (numbers == null || numbers.length == 0 ) { throw new IllegalArgumentException("Your angry message comes here"); } 

我认为至少有一个参数的最佳方法是添加一个这样的:

 public MyClass (int num, int... nums) { //Handle num and nums separately int total = num; for(i=0;i 

添加相同类型的参数以及varargs将强制构造函数需要它(至少一个参数)。 然后你只需要分别处理你的第一个参数。

正如评论中所述,不,似乎不可能强制var arg至少为1。

我能想到的唯一编译时修复只需要一个数组( Integer[] )作为构造函数的参数。 子类仍然可以在其构造函数中使用var arg,并且该类的任何其他用户只需在调用构造函数之前从所需的参数创建数组。

 public MyClass(boolean ignore, Integer... numbers) { do_something_with(numbers[]); } 

你可以做的一个非常hacky的方法是使用没有参数的方法的私有版本。 这至少会阻止此类之外的任何人在编译时传入一个参数,但它不会提供有用的错误消息。 但是,如果它是至关重要的,至少传递一个值,那就会成功。

 private MyClass() { // This exception will be thrown only if you manage to do a "new MyClass()" // within your own class since it is private. throw new RuntimeException("Why did you do this?!?"); } 

我认为这不是在̶f̶u̶n̶c̶t̶i̶o̶n̶类本身,而是当你打电话给̶f̶u̶n̶c̶t̶i̶o̶n̶课程时。 在用它调用̶f̶u̶n̶c̶t̶i̶o̶n̶类之前,确保你的数组有元素。