2015-02-22 2 views
3

Предположу, что у меня есть метод, который принимает один int в качестве аргумента,Java: как ограничить значение аргумента, которые могут быть переданы методой

предположит, что метод ожидает только значение 0, 1, 2 и не другой int.

Есть ли способ «заставить» метод принимать только 0, 1, 2?

+5

Вы всегда можете выбросить 'IllegalArgumentException', если аргумент недействителен, конечно. –

+1

Вы можете использовать AOP (Aspect Oriented Programming), например, библиотеку AspectJ: создать некоторую аннотацию, которая указывает, что один из аргументов должен быть ограничен, и создать точку соединения, которая соответствует этой аннотации, и создать Совет, который проверяет значение. Однако - это будет выполнять только проверку времени выполнения. Если вам нужно статическое, время компиляции, проверка, вам нужно создать свой собственный тип данных. –

ответ

7

Вам нужно будет создать пользовательский тип данных, который может принимать значения только 0, 1 и 2. Вы не можете использовать обычный int.

В этом случае вы могли бы использовать enum:

enum ZeroOneOrTwo { 
    ZERO(0), 
    ONE(1), 
    TWO(2); 
    public final int val; 
    private ZeroOneOrTwo(int val) { 
     this.val = val; 
    } 
} 

и использовать его следующим образом:

void myMethod(ZeroOneOrTwo arg) { 
    System.out.println("Int value: " + arg.val); 
} 

Если вы вынуждены принимать int в качестве аргумента (если вы реализуете например, интерфейс), вы можете прибегнуть к метанию IllegalArgumentException, если заданное значение вне диапазона. Но в целом вы хотели бы позволить компилятору уловить проблему, а не иметь дело с ней во время выполнения.

+0

Да, я боялся так ... –

+0

Но если вы измените порядок перечисления, порядковый номер сломает – dragon66

+0

Если метод должен принимать 0, 1 или 2, скорее всего, они представляют собой нечто иное, чем количества, в которых case ZERO, ONE и TWO будут иметь более описательные имена, где порядок не имеет значения. – aioobe

2

Возможно, это не применимо в каждом случае (но вы не указали далее, что вы пытаетесь выполнить, поэтому, возможно, это стоит сделать), но, возможно, вы можете рассмотреть возможность создания трех методов вместо одного? Или использовать наследование, поскольку вы используете язык ООП?

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

Так вместо того, чтобы ...

void addEmployee(int type) { 
    switch(type) { 
     case 0: // add regular eymploee 
     case 1: // add manager 
     case 2: // add CEO 
    } 
} 

... считают это ...

void addRegularEmployee() { 
    // ... 
} 
void addManager() { 
    // ... 
} 
void addCEO() { 
    // ... 
} 

... или даже ...

void add(Employee e) { 
    // ... 
} 
1

Как @JonSkeet прокомментировал, вы можете отправить экземпляр IllegalArgumentException. Тем не менее, я не могу найти способ перевести the way to force.

void giveMeZeroOneOrTwo(final int value) { 

    if (value != 0 && value != 1 && value != 2) { 
     throw new IllegalArgumentException("unacceptable value: " + value); 
    } 

    // now you can read the method name, huh? 
} 

or Bean Validation может работать на вас.

void giveMeZeroOneOrTwo(@Min(0) @Max(2) final int value) { 
} 

Ну, используя enum, возможно, хороший подход, и мне это понравится.

enum Magic { 
    ONE(1), 
    TWO(2), 
    THREE(3); 
    public static Magic valueOf(int value) { 
     for (final Magic v : values()) { 
      if (v.value == value) { 
       return v; 
      } 
     } 
     throw new IllegalArgumentException("undefined value: " + value); 
    } 
    private Magic(int value) { 
     this.value = value 
    } 
    private final int value; 
} 

Теперь метод, который принимает int может быть проверена.

void giveMeOneTwoOrThree(final int value) { 
    // still throws an IllegalArgumentException 
    final Magic magic = Magic.valueOf(value); 
} 
+0

. Подход очевиден: сделайте это ограничение видимым для системы типов, построив тип только с помощью три различных значения. И именно это достигается с помощью подхода, основанного на перечислении. –

Смежные вопросы