Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中强制用户填充varargs参数的好方法_Java_Variadic Functions - Fatal编程技术网

在Java中强制用户填充varargs参数的好方法

在Java中强制用户填充varargs参数的好方法,java,variadic-functions,Java,Variadic Functions,我想强制用户在调用我的构造函数时填写可选参数: public MyClass(String... params) { this.params = params; } 目前,以下代码有效: new MyClass(); 我想阻止它。我想到了这一点: public MyClass(String param1, String... otherParams) { this.params = new String[1 + otherParams.length]; this.pa

我想强制用户在调用我的构造函数时填写可选参数:

public MyClass(String... params) {
    this.params = params;
}
目前,以下代码有效:

new MyClass();
我想阻止它。我想到了这一点:

public MyClass(String param1, String... otherParams) {
    this.params = new String[1 + otherParams.length];
    this.params[0] = param1;
    // fill 1..N params from otherParams
}
String[]params
不是选项,因为我需要能够使用逗号分隔的参数


有什么好的解决方案来实现这一点吗?请不要说varargs参数必须是可选的。问题不在于此。

如果调用方没有提供非空参数数组,则抛出IllegalArgumentException


编辑:将原文解释为答案

不,在编译时没有其他方法可以做到这一点。您发现的是强制客户机代码至少传递一个参数的常见模式

你可以这样读:

// You can pass in some parameters if you want
public MyClass(String... params)


也许下面是一个额外的默认构造函数

/**
 * Please provide at least one parameter.
 */
@Deprecated
public MyClass() {
    throw new IllegalStateException("Please provide at least one parameter");
}

如果您想在编译时执行此操作,则需要按照上一个代码示例中的建议执行

然后您可以使用ApacheCommons-类:


如果有人编写“new MyClass”(“a”,null),otherParams可能为null。如果您期望的参数数量不存在,您是否可以抛出一个异常?可能是检查解决方案?因为在编译过程中检查此类条件会更好。顺便说一句,问题->评论…获取临时数组创建的价格。顺便说一句,评论是在我回答问题的同时添加的。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@JNYRanger:正式来说,这是一条评论,但实际上,这是一个如何强制用户提供非空var arg参数的解决方案。@wero我建议您将其改写为听起来更像是一个答案而不是一个注释,并解释其背后的原因。@Tom我太懒了,不知道这是否可行。仔细想想。@Tom若修饰符是私有的,新的MyClass()将调用varargs构造函数->fail@AdamSkywalker正确的。。。太糟糕了。对于public和弃用的NetBeans,我的NetBeans IDE对no-params调用进行了修改,这将调用默认构造函数。
/**
 * Please provide at least one parameter.
 */
@Deprecated
public MyClass() {
    throw new IllegalStateException("Please provide at least one parameter");
}
String[] allParams = ArrayUtils.add(otherParams, 0, param1); //Insert the first param at the first position of the array.