Предположим, что я хочу проверить все параметры метода для отрицательности. Я мог бы сделать что-то вроде этого:
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");
}
}
}
Тем не менее, мне действительно не нравится этот подход. Есть ли способ ссылаться на параметры метода по нумерации заказов? Кроме того, есть ли способ ссылаться на примитив и проверять негативность без ссылки на его точный тип?
Если вы можете получить все свои аргументы в массиве или в любой коллекции, вы можете перебрать их и проверить так:
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");
}
}
}
Я бы рекомендовал вам использовать именованные параметры.
Рассмотрите последствия, если вы добавите новый (возможно, положительный) параметр в позицию, отличную от конца, и забудьте обновить свой чек, чтобы отразить, что это может быть положительное значение. Вы потратите много времени на отладку.
Если другим людям приходится использовать/писать этот код, то использование номеров будет скрывать цель кода, и им будет сложно понять, что вы делаете.
Следующий фрагмент кода может помочь вам в более общем способе поиска отрицательных параметров:
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);
}