【问题标题】:How can I avoid creating lots overloaded methods?如何避免创建大量重载方法?
【发布时间】:2013-08-04 17:06:15
【问题描述】:

我有一个方法想在不同的场合使用。这意味着我想使用该方法,但每次传入不同数量的参数:

考虑这个例子:

public checkInput(Object a, Object b, Object c, Object d) {
    a.someMethod();
    b.someMethod();
    c.someMethod();
    d.someMethod();
}

现在我只能在传入4个参数时使用checkInput(...)这个方法。但是,有时我只能传入两个参数。

如果我想调用checkInput(a, b, null, null); 这样的方法,我会得到一个NullPointerException

所以现在我想知道,在这种情况下我是否必须使用重载,这意味着我必须创建

public checkInput(Object a) {
    a.someMethod();
}

public checkInput(Object a, Object b) {
    a.someMethod();
    b.someMethod();
}

...等等。

【问题讨论】:

    标签: java nullpointerexception overloading


    【解决方案1】:

    你可以定义Variable arity method:

    public checkInput(Object... args) {
        // args is nothing but an array.
        // You can access each argument using indices args[0], args[1], ...
    }
    

    现在,您可以使用任意数量的参数调用此方法:

    checkInput(obj);
    checkInput(obj1, obj2);
    

    使用可变参数类似于使用数组作为参数。但它为您提供了传递参数的灵活性,而无需创建数组。

    但是要小心,因为 var-args 的类型是Object,它可以接受任何类型的参数。在使用它们之前,您应该进行适当的检查。 此外,您的方法中只能有一个 vararg 参数,并且该参数也应位于参数列表的最后。

    【讨论】:

    • 我不太明白你的回答。你能再描述一下吗?
    • 我看不出这个public checkInput(Object... args)line 应该做什么。你能把它改成真正的Java吗?
    • @user2426316。那是真正的Java。请点击我答案中的链接。此外,搜索 varargs,您将获得一些与此概念相关的有用链接。
    • @user2426316 作为提醒,您可能希望在未来使用原语,而 Object 在这种情况下将无法工作,因此您需要使用特定的原语类型或更广泛的类型一个(因为缩小转换需要强制转换和可能的精度损失)
    • @RohitJain 谢谢!这真的是我需要的!太强大了!
    【解决方案2】:

    没有。只需将四个参数的方法重新使用为

    public checkInput(Object a) {
        checkInput(a, null, null, null);
    }
    
    public checkInput(Object a, Object b) {
        checkInput(a, b, null, null);
    }
    

    【讨论】:

    • 如果我为checkInput(...)method 提供null,我会得到一个空指针异常。
    • 更好的方法是什么?在这种情况下使用变量 args 会不会更有意义?
    • @Ankur,我声称它是吗?是的 var-args 肯定是一种更好的方法。但是,这也适用于 Java 5 之前的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2016-11-29
    • 2023-04-09
    相关资源
    最近更新 更多