2015-02-21 1 views
0

Скажите, что у меня был метод, который требовал, чтобы я прошел через структуру данных, а затем вернул число, сохраненное в определенном индексе, если оно было равно заданному числу. Если два числа в структуре данных были равны, тогда он вернет число, которое было первым.Java: Возвращает вопрос о стиле для if if?

public static int method(int value, List<Integer> list){ 
    for (Integer i: list){ 
     if (i == value){ 
      return i; 
     } 
    } 
} 

Это проблемное решение, потому что метод может не обязательно возвращаться. Я полагаю, вы могли бы создать переменную для хранения ссылки на эквивалентное значение и вернуть ее, поэтому компилятор не выдаст ошибку об отсутствии оператора return, но это будет бессмысленный код.

Есть ли лучший способ сделать это? Вы только вернете 0 или вернете null, в случае, если вы возвращаете объект?

+0

@LawrenceDol. OP утверждает, что очень важно в вопросе «* Это проблематичное решение, потому что метод может не обязательно возвращать *». –

+0

Как насчет изменения подписи в public static Необязательно (int, value, List ) – beresfordt

+0

@beresfordt: Я предполагаю, что код является чисто образцовым, а не фактическим (но, кто знает, в наши дни). –

ответ

2

Если не найдено ожидаемое значение и нормальное значение, возвращайте -1, чтобы указать «не найден», так как нормальный возврат является индексом массива.

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

public static int method(int value, List<Integer> list){ 
    for (int j = 0; j < list.size(); j++) { 
     Integer i = list.get(j); 
     if (i == value){ 
      return j; 
     } 
    } 
    throw new IllegalStateException("The method 'SomeClass.method' reach an invalid termination point"); 
} 
1

Я предполагаю, что это теоретический вопрос, иначе вы бы просто вернули true (он есть в списке) или false (его нет в списке). Вы уже знаете номер, который ищете, поэтому его поиск и возврат не добавляет никакого значения вызывающему коду. Фактически, для этого случая вы просто использовали бы public boolean contains(O o) от Lists implementation от Collection и не записывали свой собственный метод.

public static boolean method(int value, List<Integer> list) { 
    for (Integer i: list) 
     if (i == value) return true; 
    return false; 
} 

Поэтому, учитывая этот академический вопрос, почему бы не вернуть индекс числа в списке, который вы хотите, и вернуться -1, если номер в списке не соответствует тот, который вы хотите.

public static int method(int value, List<Integer> list) { 
    for (int j = 0; j < list.size(); j++) { 
     Integer i = list.get(j); 
     if (i == value){ 
      return j; 
     } 
    } 
    return -1; 
} 

Таким образом, вы не должны определить «особый случай» возвращаемое значение, не Autoboxing вернуть null, или определить новую конструкцию для выполнения как номер и флаг «успеха».

1

Посмотрите на Collection.contains() и List.indexOf(). Способ, которым они обрабатывают оба случая, очень идиоматичен для Java и будет сразу знаком с разработчиками Java.

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