【问题标题】:Refering to arguments of Java methods引用 Java 方法的参数
【发布时间】:2015-02-21 03:16:31
【问题描述】:

假设我想检查一个方法的所有参数是否为负值。我可以这样做:

public class test{
    public test(double a, double b, int c, int d, long e ,  long f){

        // check parameter correctness
        checkNegParam(a,"1");
        checkNegParam(b,"2");
        checkNegParam(c,"3");
        checkNegParam(d,"4");
        checkNegParam(e,"5");
        checkNegParam(f,"6");   
    }

    private void checkNegParam(double number, String order) {
        if (number < 0) {
            throw new IllegalArgumentException("Argument"+ order +" is negative");
        }
    }
}

但是,我真的不喜欢这种方法。有没有办法通过它们的顺序编号来引用方法参数?另外,有没有办法在不参考其确切类型的情况下引用原语并检查否定性?

【问题讨论】:

  • 不能不使用可变参数方法(那么它就相当于一个数组)。不,如果不检查变量,就无法检查变量是否为负值。

标签: java methods parameters reference arguments


【解决方案1】:

以下代码可能会帮助您找到更通用的负参数方法:

private void assertNotNegative(Number... numbers) {
    for (int i = 0; i < numbers.length; i++) {
        if (Math.signum(numbers[i].doubleValue()) < 0) {
            throw new IllegalStateException("Negative argument " + numbers[i] + ", index: " + i);
        }
    }
}

要调用它,只需调用:

public test(double a, double b, int c, int d, long e ,  long f) {
    assertNotNegative(a, b, c, d, e, f);
}

【讨论】:

    【解决方案2】:

    如果您可以在数组或任何集合中获取所有参数,那么您可以遍历它们并以这种方式检查:

    public class test{
        public void test(double[] args) throws IllegalArgumentException{
            for(int i = 0; i < args.length; i++){
                if(args[i] < 0) throw new IllegalArgumentException("Argument " + (i + 1) + " is negative");
            }
        }
    }
    

    如果你想保留对这个方法的调用而不自己构造数组/集合,你可以让 java 用变量 args 为你做这件事。

    public class test{
        public void test(Double... args) throws IllegalArgumentException{
            for(int i = 0; i < args.length; i++){
                if(args[i] < 0) throw new IllegalArgumentException("Argument " + (i + 1) + " is negative");
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      我建议您坚持使用命名参数。

      如果您在结尾以外的位置添加一个新的(可能是正的)参数,并且忘记更新您的检查以反映这可能是一个正值,请考虑这会带来什么影响。您将浪费大量时间进行调试。

      如果其他人必须使用/编写此代码,那么使用数字会掩盖代码的用途,他们将很难理解您在做什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-31
        • 2014-02-15
        • 2015-02-10
        • 2012-11-13
        • 1970-01-01
        相关资源
        最近更新 更多