【问题标题】:How do I force when using a constructor with a varargs parameter that at least one parameter has to be passed? [duplicate]当使用带有可变参数参数的构造函数时,我如何强制必须至少传递一个参数? [复制]
【发布时间】:2019-08-05 04:48:15
【问题描述】:

诚然,我有以下实施不佳的课程:

public class Fari{
    String name;
    String[] group;

    public Fari(String name, String... group) {
        this.name = name;
        this.group = group;
    }
    // getters, setters
}

这实际上是这样计划的,即传递名称和至少一个组标签。但是我可以创建一个只有一个参数的新 Fari 对象,而不会出现编译错误:

Fari f = new Fari("A");

以组属性为空的对象结尾。有没有办法强制将至少一个字符串作为可变参数传递?

我可以将参数String... group 更改为List<String>,但我还必须触及所有其他类。除此之外,可以传递一个空列表,这对我没有帮助。如果创建的对象应该有一个名称和至少一个组标签,我该怎么做?

【问题讨论】:

  • 你想在编译时检查还是在运行时检查?
  • 如果你需要传递参数,它不是可变参数。您可以将构造函数更改为public Fari(String name, String group, String... otherGroups) 以强制指定至少一组
  • @Progman 在运行时最多不应该存在没有组名的对象。如果在编译过程中已经可以检查它当然更好

标签: java


【解决方案1】:

解决这个问题的典型方法是

public Fari(String name, String requiredGroup, String... group)

【讨论】:

  • 感谢您的快速回复。有没有办法在不改变构造函数定义的情况下做到这一点?
  • @nopen 不在编译时打开。如果你只有可变参数,你可以在运行时检查它的长度
【解决方案2】:

您还可以检查group 大小,如果大小为

public class Fari {

    String name;
    String[] group;

    public Fari(String name, String... group) throws Exception {
        this.name = name;
        if (group.length < 1) throw new Exception();
        this.group = group;
    }
}

当然,您可以使用自己的Exception 实现在您的代码中识别它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多