【问题标题】:Nice way to force user fill varargs parameter in Java [duplicate]在Java中强制用户填充可变参数的好方法[重复]
【发布时间】:2015-10-01 15:25:48
【问题描述】:

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

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 不是一个选项,因为我需要能够使用逗号分隔的 args。

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

【问题讨论】:

  • otherParams 可能为 null,如果有人写 ´new MyClass("a", null)´
  • 如果你期望的参数数量不存在,你能不能抛出一个异常?
  • 也许检查this解决方案?

标签: java variadic-functions


【解决方案1】:

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

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

【讨论】:

  • @Tom 我太懒了,不知道这是否可行。想了想。
  • @Tom 如果修饰符是私有的,new MyClass() 将调用可变参数构造函数 -> 失败
  • @AdamSkywalker 对……太糟糕了。
  • 在公开和弃用的情况下,我的 NetBeans IDE 对无参数调用进行了删除线,并调用了默认构造函数。
【解决方案2】:

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

你可以这样读:

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

// I require one parameter, you can pass some additional if you want
public MyClass(String param1, String... otherParams)

【讨论】:

    【解决方案3】:

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

    然后你可以使用 ApacheCommons - ArrayUtils 类:

    String[] allParams = ArrayUtils.add(otherParams, 0, param1); //Insert the first param at the first position of the array.
    

    【讨论】:

      【解决方案4】:

      如果调用者未提供非空参数数组,则抛出 IllegalArgumentException。

      编辑:将原文解释为答案

      【讨论】:

      • 因为在编译过程中检查这些条件会好得多。顺便说一句问题 -> 评论。
      • ...以创建临时数组的价格。顺便说一句,评论是在我回答的同时添加的
      • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
      • @JNYRanger:形式上是评论,但实际上是解决如何强制用户提供非空var-arg参数的问题。
      • @wero 我建议您改写它,然后听起来更像是一个答案而不是评论并解释其背后的原因。
      猜你喜欢
      • 2016-08-14
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      相关资源
      最近更新 更多