Ссылаясь на аргументы методов Java

1

Предположим, что я хочу проверить все параметры метода для отрицательности. Я мог бы сделать что-то вроде этого:

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");
        }
    }
}

Тем не менее, мне действительно не нравится этот подход. Есть ли способ ссылаться на параметры метода по нумерации заказов? Кроме того, есть ли способ ссылаться на примитив и проверять негативность без ссылки на его точный тип?

  • 1
    Не без использования метода переменного аргумента (тогда это эквивалентно массиву). Нет, нет способа проверить переменную на наличие отрицательного значения без проверки переменной.
Теги:
methods
arguments
reference
parameters

3 ответа

0
Лучший ответ

Если вы можете получить все свои аргументы в массиве или в любой коллекции, вы можете перебрать их и проверить так:

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");
        }
    }
}
2

Я бы рекомендовал вам использовать именованные параметры.

Рассмотрите последствия, если вы добавите новый (возможно, положительный) параметр в позицию, отличную от конца, и забудьте обновить свой чек, чтобы отразить, что это может быть положительное значение. Вы потратите много времени на отладку.

Если другим людям приходится использовать/писать этот код, то использование номеров будет скрывать цель кода, и им будет сложно понять, что вы делаете.

0

Следующий фрагмент кода может помочь вам в более общем способе поиска отрицательных параметров:

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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню