Как разрешить только определенные значения int в качестве параметра для метода в Java? - PullRequest
0 голосов
/ 26 ноября 2018

Я создаю метод для библиотеки с двумя int parameters (min, max), метод может принимать ТОЛЬКО параметры, если максимальное значение больше минимального значения во время выполнения , означает времячеловек записывает код, если параметр недействителен, он показывает предупреждение перед запуском кода, потому что мне нужно получить Random число между обоими значениями.

то, что я нашел из моего поиска, было этим ответом Как разрешить только определенные значения в качестве параметра для метода в Java?

однако кажется, что я не могу заставить его работать со значением int.

Вот мой код:

 public void call(int min, int max) throws InvalidParameterException {
        if (min == (int) min) {
            if (max == (int) max) {
                if (max <= min) {
                    throw new InvalidParameterException();
                } else {
                    Random rand = new Random();
                    // nextInt is normally exclusive of the top value,
                    // so add 1 to make it inclusive
                    int randomNum = rand.nextInt((max - min) + 1) + min;

                }

            } else {
                throw new InvalidParameterException();
            }
        } else {
            throw new InvalidParameterException();
        }
    }

Ответы [ 5 ]

0 голосов
/ 26 ноября 2018

В других ответах упоминается обычная проверка параметров метода во время выполнения (также аспекты), ничего особенного в этом нет.Единственное, что нужно добавить, это то, что вы делаете трюк, который используется, когда у вас есть тип с плавающей запятой, и вы хотите проверить, равен ли он целочисленному типу, например, если double == int.Обычно он всегда возвращает false, поэтому вы применяете double к int для фактической проверки.В вашем коде нет необходимости в этом, поскольку у вас есть только целые числа, int == (int) int просто не требуется.

Ответ, который вы связали, касается проверки во время компиляции с использованием перечислений - здесь это невозможноможет создать перечисление с большим количеством целочисленных значений, но не делайте этого, если ваш диапазон значений действительно не ограничен.

Другой вариант, который приходит на ум (поскольку он часто используется для выполнения «магии» где-то ещечем ваш код) это обработка аннотаций, но я не думаю, что это на самом деле возможно для этого варианта использования, определенно не стандартным способом.

Что вам нужно, это какой-то анализатор исходного кода.Что-то вроде плагина Intellij / Eclipse, PMD , Checker или какого-либо другого инструмента, похожего на те.Он будет анализировать каждое вхождение вашего вызова метода и проверять, меньше ли первый аргумент, чем второй, в противном случае он не скомпилируется, вы даже не доберетесь до времени выполнения.Определенно не стоит усилий в этом случае, но это может быть хорошо, если вы хотите решить эту проблему в больших масштабах, например, с пустыми значениями Java.

0 голосов
/ 26 ноября 2018

Вы можете использовать Google Guava API и использовать его в своем методе следующим образом.

public void call(int min, int max) {
  Preconditions.checkArgument(max > min);
  // Other code here
}

Метод вызовет исключение IllegalArgumentException, если условие не выполнено.

0 голосов
/ 26 ноября 2018

Попробуйте так:

private static int getRandomIntValue(int min, int max) {

    if (min >= max) {
        throw new IllegalArgumentException("max must be greater than min");
    }

    Random r = new Random();
    return r.nextInt((max - min) + 1) + min;
}
0 голосов
/ 26 ноября 2018

Я не уверен, правильно ли я вас понимаю, но вы имеете в виду что-то вроде этого:

  public void call(int min, int max) throws InvalidParameterException {
if (max > min) {
    Random rand = new Random();
    // nextInt is normally exclusive of the top value,
    // so add 1 to make it inclusive
    int randomNum = rand.nextInt((max - min) + 1) + min;
} else {
     throw new InvalidParameterException();
}

}

0 голосов
/ 26 ноября 2018

Можно рассмотреть возможность создания пользовательской аннотации и использовать Aspect для любого метода с соответствующей аннотацией, чтобы применить его в качестве проверки проверки.

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface ValidateRange{
    Integer minValue();
    Integer maxValue();
}

Аспект может выглядеть примерно так:

@Aspect
public class ValidateRangeAspect {

    @Before(value = "execution(public * *(..)) && @annotation(ValidateRange)")
    public void validateRange(JoinPoint joinPoint, ValidateRange validateRange) {
       Integer minValue = validateRange.minValue();
       Integer maxValue = validateRange.maxValue();
       assertRange(getActualValueFromJoinPoint(), minValue, maxValue);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...